Das folgende Beispiel zeigt, wie man ein Bitmap in den Ressourcenbereich der EXE einbaut und im Nachhinein das Bitmap laden oder auch expandieren kann.
Schritt 1:
Erstellt ein neues Projekt und speichert es.
Schritt 2:
Legt die Datei "resource.rc" an und kopiert den folgenden Code in die Datei.
Pic1 BITMAP Image.bmp
Schritt 3: Kopiert die "brcc32.exe" aus dem ..\Delphi\bin\... Ordner in den Projekt Ordner.
Schritt 4:
Nun zieht ihr die "resource.rc" Datei per Drag&Drop auf die "brcc32.exe" damit die "resource.res" Datei erzeugt wird.
Schritt 5:
Öffnet das Projekt und kopiert den folgenden Code unter die Implementierung.
{$R resource.res}
Schritt 6:
Nun kommen wir zum Programmcode..
implementation
{$R *.dfm}
{$R resource.res} // Hier wird das Bitmap in den Resourcenbereich der EXE Eingebettet
// Ist für die expandierung des Bitmaps zuständig
procedure RecoverBitmapFromResource(const sRecourceName: PAnsiChar; const sDestFileName: string);
const
BM = $4D42; // Hier wird das Bitmap identifiziert
var
Bmp: TBitmap;
BMF: TBitmapFileHeader;
HResInfo: THandle;
MemHandle: THandle;
mStream: TMemoryStream;
ResPtr: PByte;
begin
BMF.bfType := BM;
{ Find, Load, and Lock the Resource containing BITMAP1 }
HResInfo := FindResource(HInstance, sRecourceName, RT_BITMAP);
MemHandle := LoadResource(HInstance, HResInfo);
ResPtr := LockResource(MemHandle);
{ the header is lost, so will need to be recalculated,
but lets be lazy and let TBitmap recreate the full header }
mStream := TMemoryStream.Create;
try
mStream.SetSize(SizeofResource(HInstance, HResInfo) + SizeOf(BMF));
mStream.Write(BMF, SizeOf(BMF));
mStream.Write(ResPtr^, SizeofResource(HInstance, HResInfo));
mStream.Seek(0, 0);
{Create the TBitmap and load the image from the MemoryStream}
Bmp := TBitmap.Create;
try
Bmp.LoadFromStream(mStream);
Bmp.SaveToFile(sDestFileName);
finally
Bmp.Free;
end;
finally
FreeResource(MemHandle);
mStream.Free;
end;
end;
// Hier wird das Bitmap in ein Image geladen
procedure TForm1.Button1Click(Sender: TObject);
var
Bitmap1 : TBitMap;
begin
Bitmap1 := TBitMap.Create;
try
// Pic1 ist die Resourcen Addresse des Bitmaps
Bitmap1.LoadFromResourceName(HInstance,'Pic1');
Image1.Picture.Assign(Bitmap1);
finally
BitMap1.Free;
end;
end;
// Hier wird das Bitmap direkt aus dem Resourcenbereich Expandiert und gespeichert
procedure TForm1.Button2Click(Sender: TObject);
begin
if SaveDialog1.Execute then begin
try
// Pic1 ist das Bitmap in der EXE
RecoverBitmapFromResource('Pic1',
SaveDialog1.FileName + '.bmp'); // Bitmap Datei
finally
end;
end;
end;
Keine Kommentare:
Kommentar veröffentlichen