Also, ich hab mich mal in die Struktur einer Res-Datei reingelesen und kann mit Bestimmtheit sagen, dass der Teil, den ich in den MemoryStream lese, der richtige ist. Allerdings weiß ich auch, dass das nicht das richtige Format für eine Bitmap ist.
Weiß jemand, wie ich den Stream aus der Resource in ein Bitmap-kompatibles Format konvertieren kann?
Ok, ich hab's:
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:
| procedure LoadImagesFromResource(const FileName: string; ImageList: TImageList; Strings: TStrings); type TResourceHeader = packed record DataSize: DWord; HeaderSize: DWord; ResType: packed array[0..1] of Word; ResName: string; DataVersion: DWord; MemoryFlags: Word; LanguageID: Word; Version: DWord; Characteristics: DWord; end;
var Bitmap: TBitmap; Buffer: array[1..2000] of Char; FileStream: TFileStream; MemoryStream: TMemoryStream; Header: TResourceHeader; bmpInfo: BITMAPINFO; bmpFileHeader: BITMAPFILEHEADER;
function ReadHeader: Boolean; var i: Integer; w: Word; begin Header.ResName := ''; Result := False; if FileStream.Read(Header, 12) < 12 then Exit; for i := 1 to ((Header.HeaderSize - 28) div 2) do begin FileStream.Read(w, 2); if w <> 0 then Header.ResName := Header.ResName + Chr(w); end; FileStream.Read(Header.DataVersion, 4); FileStream.Read(Header.MemoryFlags, 2); FileStream.Read(Header.LanguageID, 2); FileStream.Read(Header.Version, 4); FileStream.Read(Header.Characteristics, 4); Result := True; end;
begin Bitmap := TBitmap.Create; FileStream := TFileStream.Create(FileName, fmOpenRead and fmShareDenyWrite); FileStream.Read(Buffer, 32); while ReadHeader do begin FileStream.Read(bmpInfo, SizeOf(bmpInfo)); FileStream.Seek(-SizeOf(bmpInfo), soFromCurrent); FileStream.Read(Buffer, Header.DataSize); bmpFileHeader.bfType := 19778; bmpFileHeader.bfSize := SizeOf(bmpFileHeader) + Header.DataSize; bmpFileHeader.bfReserved1 := 0; bmpFileHeader.bfReserved2 := 0; bmpFileHeader.bfOffBits := 1078; MemoryStream := TMemoryStream.Create; MemoryStream.Write(bmpFileHeader, SizeOf(bmpFileHeader)); MemoryStream.Write(Buffer, Header.DataSize); MemoryStream.SaveToFile(Header.ResName + '.bmp'); MemoryStream.Seek(0, soFromBeginning); Bitmap.LoadFromStream(MemoryStream); ImageList.Add(Bitmap, nil); Strings.Add(Header.ResName); FreeAndNil(MemoryStream); end; FreeAndNil(FileStream); FreeAndNil(Bitmap); end; |