Autor |
Beitrag |
K.S.M.
      
Beiträge: 82
Windows 7 Professional
Delphi 2010, HTML, JavaScript, CSS, PHP, ein wenig C, Flash ActionScript 2.0/3.0, SQL, Assembler
|
Verfasst: Di 19.01.10 20:49
Hallo!
Ein Problem, welches mich seit längerem beschäftigt ist folgendes: Ich möchte gerne mit meinem Programm Icons erstellen, die 32bit-Grafiken mit 16x16, 24x24, 32x32, 64x64 und 256x256 Pixel Auflösung beinhalten. Diese sollen aus mehreren TPNGImage erstellt werden, die jeweils diese Auflösung besitzen. Ich habe leider bisher nur Möglichkeiten gefunden Icons zu laden, allerdings nicht die einzelnen Pixelgrößen und Farbtiefen zu ändern und dies dann nachher abzuspeichern.
Könnt ihr mir helfen?
Vielen Dank! Moderiert von Narses: Topic aus Neue Einträge / Hinweise / etc. verschoben am Di 19.01.2010 um 19:51
_________________ "Programmieren ist keine Kunst. Programmieren ist eine Fähigkeit!"
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 19.01.10 21:09
Du findest hier die Definition des Dateiformats. Das musst du dann nur entsprechend umsetzen, was nicht besonders schwer ist. Das Format ist sehr einfach gehalten:
en.wikipedia.org/wiki/ICO_(file_format)
|
|
K.S.M. 
      
Beiträge: 82
Windows 7 Professional
Delphi 2010, HTML, JavaScript, CSS, PHP, ein wenig C, Flash ActionScript 2.0/3.0, SQL, Assembler
|
Verfasst: Mi 20.01.10 20:35
So, ich habe dann für alle, die gerne ihre eigenen Icons laden und speichern möchten, eine Klasse geschrieben die das kann
Leider kann Sie nur 32-Bit-TPNGImages laden und speichern.
Vielen Dank für den Wiki-Link, jaenicke!
Ich habe den Quelltext außerdem noch in den Dateianhang gepackt.
Ich freue mich, wenn ihr noch Anmerkungen habt, Verbesserungsvorschläge usw.!
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366:
| unit IconClass;
interface
uses Classes, PNGImage;
type TIconHeader = record BitsPerPix: Word; Width, Height: Byte; Position: Int64; end; TIconHeaders = array of TIconHeader; TIcoBody = Array of TPNGImage; TIco = class private FImageCount: Word; FImages: TIcoBody; FIconHeaders: TIconHeaders; procedure DestroyImages; procedure WriteHeader( Str: TStream ); procedure WriteImageHeader( Id: Integer; Str: TStream ); procedure WriteImage( Id: Integer; Str: TStream; var Size, Offset: Integer ); procedure ReadHeaderAndImage( Id: Integer; Str: TStream ); procedure ReadImage( Id: Integer; Str: TStream; Start: Integer ); function GetHeader( Index: Integer ): TIconHeader; function GetImage( Index: Integer ): TPNGImage; procedure SaveImages(Stream: TStream); public constructor Create; virtual; destructor Destroy; override; function AddImage( aImage: TPNGImage ): Integer; function AddImageRes( const aResName, aResType: String ): Integer; procedure SaveToStream( Stream: TStream ); procedure LoadFromStream( Stream: TStream ); procedure SaveToFile( const FileN: String ); procedure LoadFromFile( const FileN: String ); property ImgCount: Word read FImageCount; property Header[ Index: Integer ]: TIconHeader read GetHeader; property Images[ Index: Integer ]: TPNGImage read GetImage; end;
implementation
constructor TIco.Create; begin SetLength( FImages, 0 ); SetLength( FIconHeaders, 0 ); FImageCount := 0; end;
destructor TIco.Destroy; begin DestroyImages; inherited Destroy; end;
procedure TIco.DestroyImages; var I: Integer; begin if Length( FImages ) > 0 then begin for I := 0 to FImageCount - 1 do FImages[ I ].Free; SetLength( FImages, 0 ); SetLength( FIconHeaders, 0 ); end; end;
function TIco.AddImage(aImage: TPngImage): Integer; var L: Integer; begin L := ImgCount; SetLength( FImages, L+1 ); Setlength( FIconHeaders, L+1 ); Inc( FImageCount ); FImages[L] := TPNGImage.Create; FImages[L].Assign( aImage ); with FIconHeaders[L] do begin BitsPerPix := 32; Width := 0; if FImages[L].Width < 256 then Width := FImages[L].Width; Height := 0; if FImages[L].Height < 256 then Height := FImages[L].Height; end; Result := L; end;
function TIco.GetImage(Index: Integer): TPNGImage; begin Result := nil;
if Index < 0 then Exit; if Index >= FImageCount then Exit;
Result := TPngImage.Create; try Result.Assign( FImages[ Index ] ); except Result.Free; end; end;
procedure TIco.WriteImageHeader( Id: Integer; Str: TStream ); var Buffer: Word; begin with FIconHeaders[ Id ] do begin Str.Write( Width, 1 ); Str.Write( Height, 1 );
Buffer := 0; Str.Write( Buffer, 2 ); Buffer := 1; Str.Write( Buffer, 2 ); Buffer := 32; Str.Write( Buffer, 2 );
Position := Str.Position;
Str.Write( Buffer, 8 ); end;
end;
procedure TIco.WriteImage(Id: Integer; Str: TStream; var Size: Integer; var Offset: Integer); begin Offset := Str.Position; FImages[ Id ].SaveToStream( Str ); Size := Str.Position - Offset; end;
procedure TIco.WriteHeader(Str: TStream); var Buffer: Word; begin Buffer := 0; Str.Write( Buffer, 2 ); Buffer := 1; Str.Write( Buffer, 2 ); Str.Write( FImageCount, 2 ); end;
procedure TIco.SaveToStream(Stream: TStream); var I: Integer; begin if not assigned( Stream ) then Exit;
WriteHeader( Stream );
for I := 0 to FImageCount - 1 do WriteImageHeader( I, Stream );
SaveImages( Stream ); end;
procedure TIco.SaveToFile(const FileN: string); var Fs: TFileStream; begin Fs := TFileStream.Create( FileN, fmCreate ); try SaveToStream( Fs ); finally Fs.Free; end; end;
function TIco.GetHeader(Index: Integer): TIconHeader; begin if Index < 0 then Exit; if Index >= FImageCount then Exit; Result := FIconHeaders[ Index ]; end;
procedure TIco.LoadFromStream(Stream: TStream); var I: Integer; begin Stream.Position := 4; Stream.Read( FImageCount, 2 ); DestroyImages; SetLength( FImages, FImageCount ); SetLength( FIconheaders, FImageCount ); for I := 0 to FImageCount - 1 do ReadHeaderAndImage( I, Stream ); end;
procedure TIco.LoadFromFile(const FileN: string); var Fs: TFileStream; begin Fs := TFileStream.Create( FileN, $0000 ); try LoadFromStream( Fs ); finally Fs.Free; end; end;
procedure TIco.SaveImages(Stream: TStream); var CurPos: Int64; Size, I, Offset: Integer; begin for I := 0 to FImageCount - 1 do begin WriteImage(I, Stream, Size, Offset); CurPos := Stream.Position; Stream.Position := FIconHeaders[I].Position; Stream.Write(Size, 4); Stream.Write(Offset, 4); Stream.Position := CurPos; end; end;
procedure TIco.ReadHeaderAndImage(Id: Integer; Str: TStream); var Start: Integer; begin with FIconHeaders[Id] do begin Str.Read( Width, 1 ); Str.Read( Height, 1 ); Str.Position := Str.Position + 4; Str.Read( BitsPerPix, 2 ); Str.Position := Str.Position + 4; Str.Read( Start, 4 ); ReadImage( Id, Str, Start ); end; end;
procedure TIco.ReadImage(Id: Integer; Str: TStream; Start: Integer); var CurPos: Int64; begin CurPos := Str.Position; Str.Position := Start; FImages[ Id ] := TPNGImage.Create; FImages[ Id ].LoadFromStream( Str ); Str.Position := CurPos; end;
function TIco.AddImageRes(const aResName: string; const aResType: string): Integer; var RC: TResourceStream; PNG: TPNGImage; begin RC := TResourceStream.Create( HInstance, aResName, PChar( aResType ) ); try PNG := TPngImage.Create; try PNG.LoadFromStream( RC ); Result := AddImage( PNG ); finally PNG.Free; end; finally RC.Free; end; end;
end. |
Einloggen, um Attachments anzusehen!
_________________ "Programmieren ist keine Kunst. Programmieren ist eine Fähigkeit!"
|
|
|