Screenshot als png File speichern

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
carknue
Beiträge: 7
Registriert: Mi 7. Apr 2010, 20:06

Screenshot als png File speichern

Beitrag von carknue »

Ich möchte einen Screenshot meiner App als png speichern. Mit Delphi klappte das wunderbar. Unter Lazarus mußte ich nur die alte png Unit rauswerfen. Ich bekomme zwar ein png, dass auch die richtigen Maße hat aber es ist nur schwarz. Was mache ich falsch?

Code: Alles auswählen

procedure TForm1.Button5Click(Sender: TObject);
 
var
  Bitmap: TBitmap;
  png: TPortableNetworkGraphic;
begin
  Screen.Cursor:=crHourglass;
  Bitmap := TBitmap.Create;
  Bitmap.Width := ClientWidth;
  Bitmap.Height := ClientHeight;
  png := TPortableNetworkGraphic.Create;
  try
    with Bitmap.Canvas do
      CopyRect(ClientRect,Canvas,ClientRect);
      //png.Filters := [pfPaeth];
      png.Assign(Bitmap);
      exportname:= 'shot';
      png.SaveToFile(exportname+'.png');
      Showmessage('Screen shot saved to '+ exportname+'.png')
  finally
    Bitmap.Free;
    png.Free;
  end;
  Screen.Cursor:=crDefault;
end;

Benutzeravatar
theo
Beiträge: 10859
Registriert: Mo 11. Sep 2006, 19:01

Re: Screenshot als png File speichern

Beitrag von theo »

Du solltest den Screenshot mit "LoadFromDevice" nehmen:
Siehe hier:
http://www.lazarus.freepascal.org/index ... 989.0.html" onclick="window.open(this.href);return false;

Und noch was: Benutze kein "with" das ist Teufelszeug! :wink:

carknue
Beiträge: 7
Registriert: Mi 7. Apr 2010, 20:06

Re: Screenshot als png File speichern

Beitrag von carknue »

Ok, ich habe es mal versucht, es an meine Bedürfnisse anzupassen. Ich möchte also nur einen Screenhot vom kompletten Form meiner App. Mit der angehängten Prozedur klappt das nun fast, es fehlt leider die Statusbar. Die sollte doch eigentlich noch zum Form gehören. Auf den entstehenden Bilder fehlt sie aber, es ist vorher schon abgeschnitten. Wie kriege ich nun die Statusbar auch noch in den Screenshot?

Code: Alles auswählen

procedure TForm1.Button5Click(Sender: TObject);
 
var
  MyBitmap: TBitmap;
  MyBitmap2: TBitmap;
  MyDC: HDC;
  png: TPortableNetworkGraphic;
  R: TRect;
begin
  R.TopLeft := Form1.BoundsRect.TopLeft;
  R.BottomRight := Form1.BoundsRect.BottomRight;
  MyDC := GetDC(Self.Handle);
  MyBitmap := TBitmap.Create;
  MyBitmap2 := TBitmap.Create;
  MyBitmap2.Width := R.Right - R.Left;
  MyBitmap2.Height := R.Bottom - R.Top;
  png := TPortableNetworkGraphic.Create;
 
  try
    MyBitmap.LoadFromDevice(MyDC);
    MyBitmap.SaveToFile('FormsAppearance.bmp');
    //MyBitmap2.Canvas.CopyRect(ClientRect,MyBitmap.Canvas,ClientRect);
    MyBitmap2.Canvas.copyRect(Rect(0, 0, MyBitmap2.Width, MyBitmap2.Height),MyBitmap.Canvas, R);
    MyBitmap2.SaveToFile('FormsAppearance2.bmp');
    png.Assign(MyBitmap2);
    png.SaveToFile('shottest.png');
  finally
    ReleaseDC(Self.Handle, MyDC);
    FreeAndNil(MyBitmap);
    FreeAndNil(MyBitmap2);
    png.Free;
  end;
end;

Antworten