image von Control

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...

image von Control

Beitragvon Vbxler » 7. Sep 2015, 06:25 image von Control

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
-------------------------
Vbxler
 
Beiträge: 102
Registriert: 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1) | 
CPU-Target: 32Bit
Nach oben

Beitragvon Michl » 7. Sep 2015, 07:51 Re: image von Control

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; 
Michl
 
Beiträge: 2320
Registriert: 19. Jun 2012, 12:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon Vbxler » 7. Sep 2015, 21:05 Re: image von Control

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
-------------------------
Vbxler
 
Beiträge: 102
Registriert: 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1) | 
CPU-Target: 32Bit
Nach oben

Beitragvon Michl » 7. Sep 2015, 21:51 Re: image von Control

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; 
Michl
 
Beiträge: 2320
Registriert: 19. Jun 2012, 12:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon Vbxler » 8. Sep 2015, 04:56 Re: image von Control

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
-------------------------
Vbxler
 
Beiträge: 102
Registriert: 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1) | 
CPU-Target: 32Bit
Nach oben

Beitragvon Michl » 8. Sep 2015, 08:43 Re: image von Control

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; 
Michl
 
Beiträge: 2320
Registriert: 19. Jun 2012, 12:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

• Themenende •

Zurück zu Multimedia



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

porpoises-institution
accuracy-worried