this slowpoke moves

Export & Save Bitmap from Resource

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

Beliebte Posts

Translate