Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Problem bei Screenshoterstellung mit Image-Kompo (https://www.delphipraxis.net/74065-problem-bei-screenshoterstellung-mit-image-kompo.html)

mlspider 27. Jul 2006 15:53


Problem bei Screenshoterstellung mit Image-Kompo
 
Ich versuche ein Screenshot mit folgendem Code zu machen:

Delphi-Quellcode:
procedure TCover.ScreenToFile(aFileName: string);
var
  Bitmap: TBitmap;
  JPG : TJPEGImage;
  Canvas: TCanvas;
begin
  Canvas := TCanvas.Create;
  try
    Canvas.Handle := GetWindowDC(0);
    Application.ProcessMessages;
    try
      Bitmap := TBitmap.Create;
      Application.ProcessMessages;
      JPG := TJPEGImage.Create;
      Bitmap.PixelFormat:=pf32bit;
       Application.ProcessMessages;
      try
        Bitmap.Width := Screen.DesktopWidth;
        Bitmap.Height:= Screen.DesktopHeight;
        Bitmap.PixelFormat := pfDevice;
         Application.ProcessMessages;
        BitBlt(Bitmap.Canvas.Handle, 0, 0, Pred(Screen.DesktopWidth), Pred(
        Screen.DesktopHeight), Canvas.Handle, Screen.DesktopLeft,
        Screen.DesktopTop, Bitmap.Canvas.CopyMode);
        Application.ProcessMessages;
//Kompression
        JPG.CompressionQuality:=50;
        JPG.Assign(Bitmap);
        Application.ProcessMessages;
        if fileexists(aFileName) then
          deletefile(aFileName);
        JPG.SaveToFile(aFileName);
      finally
//Größe
       //resizepictur(aFileName,300,300);
        Bitmap.Free;
        JPG.Free;
      end;
    finally
      ReleaseDC(0, Canvas.Handle);
      Application.ProcessMessages;
    end;
  finally
    Canvas.Free;
  end;
end;
Der Aufruf:

Delphi-Quellcode:
procedure TCover.JvTransparentButton1Click(Sender: TObject);
begin
 ScreenToFile('Screen1.jpg');
end;
Die in einer Image-Kompo zur Laufzeit über OpenPictureDialog geladenen Bilder werden einfach ignoriert. Lege ich ein Bild zur Entwurfszeit fest, funktioniert alles wunderbar.

Wo könnte der Haken sein?

marabu 27. Jul 2006 16:13

Re: Problem bei Screenshoterstellung mit Image-Kompo
 
Zeige doch mal den Code, der nicht funktioniert. Deine Prozedur ScreenToFile() scheint ja keine Probleme zu haben - wenn ich dich richtig verstehe. Die Aufrufe von Application.ProcessMessages kannst du dir wohl schenken und auch das vorsorgliche Löschen einer etwa bereits vorhandenen Ausgabedatei dürfte nichts bringen.

marabu

mlspider 27. Jul 2006 16:19

Re: Problem bei Screenshoterstellung mit Image-Kompo
 
Das war schon die gesamte Procedur die für den Sreen zuständig ist. Leider werden zur Laufzeit geladene Bilder ignoriert und durch das schon zur Entwurfszeit festgelegte Bild ersetzt.

marabu 27. Jul 2006 16:35

Re: Problem bei Screenshoterstellung mit Image-Kompo
 
Ich kann dir gerade nicht so recht folgen. Du hattest von einem OpenPictureDialog geschrieben, über den du zur Laufzeit ein Bild in eine TImage-Komponente lädst. Das hat doch mit deiner Speicher-Routine nichts zu tun?

Funktioniert deine Routine ScreenToFile() nun oder vermutest du darin einen Fehler?

marabu

mlspider 27. Jul 2006 16:43

Re: Problem bei Screenshoterstellung mit Image-Kompo
 
Ja, ich lade zur Laufzeit über OpenPictureDialog ein Bild in die besagte Image-Kompo. Die Routine verhält sich so, wie sie sein soll. Es wird alles "abgelichtet" bis auf das geladene Bild. Ich schmeiß meinen Rechner gleich aus dem Fenster.

marabu 27. Jul 2006 16:46

Re: Problem bei Screenshoterstellung mit Image-Kompo
 
Was meinst du mit besagter Image-Komponente? Etwa TCover?

marabu

mlspider 27. Jul 2006 16:50

Re: Problem bei Screenshoterstellung mit Image-Kompo
 
Nein, TImage. Vielleicht liegt es daran, daß ich das Form als verfügbares Formular bereitstelle?

marabu 27. Jul 2006 17:03

Re: Problem bei Screenshoterstellung mit Image-Kompo
 
Hallo Mario,

heute ist wohl nicht mein Tag. Ich erkenne einfach nicht, was deine TImage-Komponente mit dem gezeigten Code zu tun haben soll. Eine funktionierende Funktion (GrabImage) um den Bildschirminhalt in ein Bitmap zu speichern habe ich dir in einem anderen thread schon angeboten. Die Zuweisung per Assign an ein JPegImage dürfte kein Problem darstellen.

Delphi-Quellcode:
var
  jpg: TJpegImage;
  bm: TBitmap;
begin
  bm := GrabImage(GetDesktopWindow);
  with TJpegImage.Create do
  begin
    // ...
    Assign(bm);
    if SaveDialog.Execute then
      SaveToFile(SaveDialog.FileName);
    Free;
  end;
  bm.Free;
end;
Deprimierte Grüße

marabu

mlspider 27. Jul 2006 17:13

Re: Problem bei Screenshoterstellung mit Image-Kompo
 
@marabu. Mein Tag scheint dies heute auch nicht zu sein. Das Problem war so banal, dass man schon wieder drüber lachen könnte.

Vorher:

Delphi-Quellcode:
procedure TCover.JvTransparentButton1Click(Sender: TObject);
begin
 ScreenToFile('Screen1.jpg');
end;
Nachher:

Delphi-Quellcode:
procedure TCover.JvTransparentButton1Click(Sender: TObject);
begin
 ScreenToFile('C:\Screen1.jpg');
end;
Es wurde immer das aktuelle Screen erzeugt. Nur ohne Pfadangabe verrirrt sich jederman auf seinen Festplatten.

Trotzdem Danke für Deine Kopfschmerzen. Das Wetter kann einen ja auch auf dem Keks gehen.

Beste Grüße

Mario


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 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