Naja mit Bummis Funktion habe ich es so hinbekommen:
Delphi-Quellcode:
var Icon : TIcon;
Bitmap,TmpBitmap : TBitmap;
IconInfo : TCursorOrIcon;
IconRec : TIconRec;
FileStream : TFileStream;
BmfInfo : TBitmapInfoHeader;
MemStream : TMemoryStream;
X,Y : Integer;
begin
Bitmap := TBitmap.Create;
try
Bitmap.LoadFromFile('C:\Users\Mario\Desktop\test_ico.bmp');
Bitmap.PixelFormat := pf8bit;
Icon := BitmapToIcon(Bitmap,32);
finally
Bitmap.Free;
end;
try
MemStream := TMemoryStream.Create;
try
Icon.SaveToStream(MemStream); //In dem Stream ist aber eine Komplette Ico-Datei inklusive Header
Wenn du, was ich ja vermute, eine Ico-Datei mit mehreren Bitmaps machen willst musst du beide Header überschreiben
FileStream := TFileStream.Create('C:\Users\Mario\Desktop\test_create.ico',fmCreate);
try
FillChar(IconInfo,SizeOf(IconInfo),0);
IconInfo.wType := RC3_ICON;
IconInfo.Count := 1;
FileStream.WriteBuffer(IconInfo,SizeOf(IconInfo));
FillChar(IconRec,SizeOf(IconRec),0);
IconRec.Width := 32; //Header Manuel schreiben
IconRec.Height := 32;
IconRec.Reserved1 := 1; //Immer 1
IconRec.Reserved2 := 8; //Pixelformat in Bits
IconRec.DIBSize := MemStream.Size - SizeOf(IconRec) - SizeOf(IconInfo); //Größe anpassen
IconRec.DIBOffset := FileStream.Position + SizeOf(IconRec); //Sowie Pos neusetzen
FileStream.WriteBuffer(IconRec,SizeOf(IconRec)); //Schreiben
FileStream.Position := IconRec.DIBOffset; //Zur Pos des Bild begins
FileStream.WriteBuffer(Pointer(Integer(MemStream.Memory) + SizeOf(IconRec) + SizeOf(IconInfo))^,IconRec.DIBSize);
finally
FileStream.free;
end;
finally
MemStream.free;
end;
finally
Icon.free;
end;
end;
EDIT:Sehe schon du hast es, naja aber für die Leute die es "einfacher" haben wollen.
Mann muss natürlich ein bischen umschreiben, wenn man mehrer Header reinschreiben will, aber das denk ich wäre möglich.
EDIT2: @DeddyH : So der Schönheit und der
RAM-Memory-Sicherung zuliebe.