image von Control

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Vbxler
Beiträge: 125
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

image von Control

Beitrag von Vbxler »

Hallo Leute,

ich versuche gerade mit folgendem Code ein Bild von einem Panel in einer Datei zu speichern:

Code: Alles auswählen

 
imgGrafik.Picture.Bitmap.Width  := iImageWidth;     //1000
imgGrafik.Picture.Bitmap.Height := iImageHeight;    //250
 
pnAbfrage.PaintTo(imgGrafik.Picture.Bitmap.Canvas, 5, 5);
imgGrafik.Picture.SaveToFile('01_Grafik.png')
 
Dabei wird die Grafik aber auf dem Panel gezeichnet,
die erzeugte PNG-Datei hat zwar die angegebene Größe, ist aber leer.
Das Panel hat wohl kein 'PaintOnCanvas'.

Frage:
Wie bringe ich die Grafik in die Datei?

Danke für eure Hilfe!
Vbxler
-------------------------

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: image von Control

Beitrag von Michl »

Füge mal ein Canvas.Clear von dem PaintTo ein:

Code: Alles auswählen

imgGrafik.Picture.Bitmap.Width  := iImageWidth;     //1000
imgGrafik.Picture.Bitmap.Height := iImageHeight;    //250
 
imgGrafik.Picture.Bitmap.Canvas.Clear;
pnAbfrage.PaintTo(imgGrafik.Picture.Bitmap.Canvas, 5, 5);
imgGrafik.Picture.SaveToFile('01_Grafik.png')


Es ist ein bekanntes Problem, dass das interne RasterImage.Canvas erst erstellt werden muss, bevor Zeichenoperationen vorgenommen werden dürfen. Besonders gut ist das an diesem Beispiel demonstrierbar:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  Bitmap: TBitmap;
begin
  Bitmap := TBitmap.Create;
  Bitmap.Width  := 320;
  Bitmap.Height := 240;
  Bitmap.Canvas.Brush.Color := clRed;
  Bitmap.Canvas.Clear;
  Bitmap.SaveToFile('Test1.bmp');
  Bitmap.Canvas.Clear;
  Bitmap.SaveToFile('Test2.bmp');
  FreeAndNil(Bitmap);
end;
Bei mir (Windows) ist Test1.bmp schwarz, erst Test2.bmp ist entsprechend Brush.Color rot.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Vbxler
Beiträge: 125
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Re: image von Control

Beitrag von Vbxler »

Vielen Dank für Deine Hilfe, das funktioniert soweit,
lediglich werden die TStringGrid, die sich ebenfalls auf
dem Panel befinden, auf dem exportierten nur als Rahmen
angezeigt, nicht aber der Inhalt der Zellen.
Einige Zellen werden über DrawCell eingefärbt, das habe ich
rausgenommen, bringt aber auch nichts

Auch habe ich habe schon verschiedenste Einstellungen in den
Property's probiert zu ändern, bringt aber keine Verbesserung.
Labels, Button, und TChart wird normal angezeigt.

Woran könnte das liegen??
Vbxler
-------------------------

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: image von Control

Beitrag von Michl »

Ich dachte, du willst ein Image von einem Panel machen, an die Objekte darauf hatte ich gar nicht gedacht.

Evtl. genügt es dir ein "Foto" vom Panel zu machen?! Unter Windows7 geht es z.B. so:

Code: Alles auswählen

uses ..., LCLIntf; 
...
procedure TForm1.Button1Click(Sender: TObject);
var
  aImage: TImage;
begin
  aImage := TImage.Create(nil);
  try
    aImage.Picture.Bitmap.LoadFromDevice(GetDC(pnAbfrage.Handle));
    aImage.Picture.SaveToFile('01_Grafik.png');
  finally
    aImage.Free;
  end;
end;


[Edit]
Vbxler hat geschrieben:lediglich werden die TStringGrid, die sich ebenfalls auf
dem Panel befinden, auf dem exportierten nur als Rahmen
angezeigt, nicht aber der Inhalt der Zellen.
...
Woran könnte das liegen??
Das könnte ein Bug (bzw. noch nicht implementiertes Feature) sein. Sehr schön an folgendem Bsp. zu sehen:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  FOffset := 0;
  Timer1.Enabled := True;
end;
 
procedure TForm1.FormPaint(Sender: TObject);
begin
  StringGrid1.PaintTo(Canvas, FOffset, FOffset div 5);
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Inc(FOffset);
  if FOffset > 50 then FOffset := 0;
  Repaint;
end;

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Vbxler
Beiträge: 125
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Re: image von Control

Beitrag von Vbxler »

Vielen, vielen Dank für Deine tolle Hilfe!

Es funktioniert jetzt super.

Die Unterstützung und die Umgangsformen
in diesem Forum sind wirklich toll.

Danke!
Vbxler
-------------------------

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: image von Control

Beitrag von Michl »

Danke für die freundlichen Worte.

Ich habe nochmal nachgeschaut. Die Methode .PaintTo ist eine Methode vom TWinControl und z.Zt. für ein TStringGrid nicht verwendbar. Siehe z.B. http://bugs.freepascal.org/view.php?id=22132.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Antworten