Announcement

Collapse
No announcement yet.

Alle grafischen Komponenten auf einem Panel in JPEG-File abspeichern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Alle grafischen Komponenten auf einem Panel in JPEG-File abspeichern

    Hallo,
    ich versuche derzeit ein Panel oder eine Form mit mehreren grafischen Komponenten sozusagen als Screenshot in ein JPEG-File abzuspeichern. In den Delphi-Foren gibt es einige Beispiele die mir auch schon etwas weitergeholfen und zu der Funktion unten geführt haben. Aber es gibt noch folgendes Problem:
    Es wird immer nur das weggeschrieben, was gerade auf dem Screen im Bereich der Form/des Panels sichtbar ist. Solange die Form im Vordergrund komplett sichtbar ist funktioniert alles, wenn aber ein anderes Fenster davor gerät oder das Fenster minimiert wird oder der Bildschirmschoner zuschlägt klappt es aber nicht mehr. Es wird immer das weggeschrieben was gerade im Bereich der Form auf dem Screen sichtbar ist. Das liegt wohl am Kopieren mit der Funktion bitblt über das Canvas-Handle des Panels.

    Hat jemand eine Idee wie man das richtig machen kann?

    Viele Grüße
    Gary


    TYPE
    TCanvasPanel = CLASS( TPanel)
    public
    property Canvas;
    end;


    procedure TForm1.BitBtnSaveGraphicClick(Sender: TObject);
    var
    BMP:TBitmap;
    JPEG:TJPEGImage;

    begin
    BMP := NIL;
    JPEG := NIL;
    TRY // Lade in eine Bitmap
    BMP:=TBitmap.Create;
    BMP.Width:= Form2.CanvasPanel1.Width;
    BMP.Height:= Form2.CanvasPanel1.Height;

    bitBlt(BMP.Canvas.Handle,0,0,Form2.CanvasPanel1.Wi dth,Form2.CanvasPanel1.Height,
    Form2.CanvasPanel1.Canvas.Handle,0,0,SRCCopy);

    // Konvertiere zu JPEG
    JPEG:=TJPEGImage.Create;
    JPEG.Performance:=jpBestQuality;
    JPEG.CompressionQuality:=100;
    JPEG.Assign(BMP);
    JPEG.SaveToFile( SaveDialog1.FileName );
    Finally
    BMP.Free;
    JPEG.Free;
    end;

    end;

  • #2
    Erste Verbesserung

    Hallo,
    habe ein bisschen 'rumexperimentiert und eine erste Verbesserung erreicht. Ich nehme kein Panel sondern den Canvas der ganzen Form. Wenn man die Property AlphaBlend auf TRUE setzt und AlphaBlendValue auf 255 wird der Inhalt der Form auch dann kopiert, wenn das Fenster von einem anderen überlappt wird oder minimiert ist:

    Form2.AlphaBlend := TRUE;
    Form2.AlphaBlendValue := 255;

    procedure TForm1.BitBtnSaveGraphicClick(Sender: TObject);
    var
    JPEG:TJPEGImage;
    begin
    JPEG := NIL;
    TRY
    JPEG := TJpegImage.Create;
    JPEG.Performance:=jpBestQuality;
    JPEG.CompressionQuality:=100;
    Image1.Canvas.CopyRect(RECT(0,0,Image1.Width,Image 1.Height),Form2.Canvas,
    RECT(0,0,Form2.Width,Form2.Height));

    JPEG.Assign(Image1.Picture.Bitmap);
    JPEG.SaveToFile( SaveDialog1.FileName );
    FINALLY
    JPEG.Free;
    END;
    end; (*--------------------------------------------------------------*)

    Comment


    • #3
      Doch zurück zum PanelCanvas

      Habe mich entschieden nun doch wie anfangs beschrieben das Panel zu nehmen, da bei Verwendung der Canvas der Form auch der Fensterrand mitabgespeichert wurde. Bei Panel kann man Pixel-genau die Größe angeben und genau das wird dann auch mit Image.Canvas.CopyRect ins Bitmap kopiert und danach in das JPEG-File geschrieben. Hier der aktuelle Code:


      procedure TForm1.BitBtnSaveGraphicClick(Sender: TObject);
      var
      JPEG:TJPEGImage;
      begin
      Image1.Canvas.CopyRect(RECT(0,0,Image1.Width,Image 1.Height),Form2.CanvasPanel1.Canvas, RECT(0,0,Form2.CanvasPanel1.Width,Form2.CanvasPane l1.Height) );

      JPEG := NIL;
      TRY
      JPEG := TJpegImage.Create;
      JPEG.Performance:=jpBestQuality;
      JPEG.CompressionQuality:=100;
      JPEG.Assign(Image1.Picture.Bitmap);
      JPEG.SaveToFile( SaveDialog1.FileName );
      FINALLY
      JPEG.Free;
      END;

      end; (*--------------------------------------------------------------*)

      Comment

      Working...
      X