Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Image aus Image schneiden (https://www.delphipraxis.net/161592-image-aus-image-schneiden.html)

Stread 11. Jul 2011 13:41


Image aus Image schneiden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi, ich möchte gerne einen Screenshot nur von einem Fenster machen.
Ich drücke auf den Button lasse die Maustaste gedrückt und lasse sie auf einem anderen Fenster los.
Die Anwendung nimmt den Screenshot vom ganzen Bildschirm und stellt danach das Fenster frei.
Meine Methode funktioniert auch ganz gut, in den beiden Images wird das richtige Bild angezeigt, allerdings kann ich es nur 1x ausführen. Beim 2ten mal gibt es Fehler.
Das gleiche Problem gibt es wenn ich es einmal ausgeführt habe und dann die ganze Anwendung schließen will.
Scheint ein größerer Fehler zu sein?
Fehler: http://s7.directupload.net/file/d/2582/cw6v8mp2_jpg.htm

Delphi-Quellcode:
//Fertigt einen Screenshot vom Desktop an
procedure MakeScreenShot(const ATarget: TBitmap);
var
   DesktopDC: HDC;
begin
   DesktopDC := CreateDC('DISPLAY', nil, nil, nil);
   try
     ATarget.PixelFormat := pfDevice;
     ATarget.Width := Screen.Width;
     ATarget.Height := Screen.Height;

     BitBlt(ATarget.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, DesktopDC, 0, 0, SRCCOPY);
   finally
     DeleteDC(DesktopDC);
   end;
end;

procedure TForm1.Button9MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var p:TWindowPlacement ;
h :HWND;
SourceBitmap : TBitmap;
TargetBitmap : TBitmap;
Cut : TRect;
begin
  h:=WindowFromPoint(Mouse.CursorPos);
   p.Length:=SizeOf(TWindowPlacement);
   GetWindowPlacement(h,@p);

MakeScreenShot(Image1.Picture.Bitmap);
Image1.Repaint;

 SourceBitmap:= TBitmap.Create;
 TargetBitmap:= TBitmap.Create;
 SourceBitmap:=Image1.Picture.Bitmap;

   Cut.Left := p.rcNormalPosition.Left;
   Cut.Top := p.rcNormalPosition.Top;
   Cut.Right := p.rcNormalPosition.Right;
   Cut.Bottom := p.rcNormalPosition.Bottom;

  try
   TargetBitmap.Width := Cut.Right - Cut.Left;
   TargetBitmap.Height := Cut.Bottom - Cut.Top;

   BitBlt(TargetBitmap.Canvas.Handle, 0, 0, Cut.Right, Cut.Bottom, SourceBitmap.Canvas.Handle, Cut.Left, Cut.Top, SRCCOPY);
   SourceBitmap.Canvas.Refresh;
   Image2.Picture.Bitmap:=TargetBitmap;
   Image2.Repaint;
   JPEG;
    finally
     SourceBitmap.Free;
     TargetBitmap.Free;
  end;

end;
Soll:http://s1.directupload.net/file/d/2582/e2aoyt2m_jpg.htm

DeddyH 11. Jul 2011 13:54

AW: Image aus Image schneiden
 
Wieso hängst Du die Bilder nicht an Deinen Beitrag an? Dann bleiben Sie uns auch erhalten. Und zu Deinem Code: ich würde den Screenshot ja in der SourceBitmap und den Ausschnitt dann in TargetBitmap speichern. Anschließend diese beiden Bitmaps den jeweiligen Images zuordnen, das spart wohl auch die ganzen Refresh-Aufrufe.

Stread 11. Jul 2011 16:29

AW: Image aus Image schneiden
 
Ich habe es jetzt so geändert
Delphi-Quellcode:
 SourceBitmap:= TBitmap.Create;
 TargetBitmap:= TBitmap.Create;
 MakeScreenShot(SourceBitmap);
Nun geht es und nimmt das Fenster so auf wie man es sieht. Mit evtl. anderen Fenstern drüber.

Was war den der Fehler? Das refresh von Image1 am Anfang?

DeddyH 11. Jul 2011 16:36

AW: Image aus Image schneiden
 
Ich vermute, das lag am
Zitat:

Delphi-Quellcode:
MakeScreenShot(Image1.Picture.Bitmap);

Wenn das Image bereits ein Bild enthält, kann das IIRC ins Auge gehen. Den genauen Grund weiß ich nicht mehr, aber so wie jetzt finde ich das eh eleganter ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz