PaintTo

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

PaintTo

Beitrag von monta »

Kann das jemand bestätigen, das folgender Code zwar unter Windows, nicht aber unter Linux mit GTK2 läuft?

Bzw. hat jemand vielleicht sogar eine Lösung dafür?

Code: Alles auswählen

procedure ChartToHtml(const BarChart: TBarChart);
  var
    Bitmap: TJPEGImage;
    tempRect: TRect;
  begin
    Bitmap := TJPEGImage.Create;
    try
      Bitmap.Width := BarChart.Width;
      Bitmap.Height := BarChart.Height;
      BarChart.PaintTo(Bitmap.Canvas, 0, 0);
      Bitmap.SaveToFile(BarChart.Name + '.jpg');
      HtmlOutput.Add('<img src="' + BarChart.Name + '.jpg">');
    finally
      Bitmap.Free;
    end;
  end;
Ich vermute ja fast, es hat mit den allgemeinen Problemen mit dem Canvas unter Linux zu tun. Der Umweg über CopyRect als Lösung geht nicht, da da leider nur der Sichtbare Bereich das BarCharts kopiert wird. :(
Johannes

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: PaintTo

Beitrag von pluto »

Was ist denn der Genaue Fehler ? Geht "PaintTo" nicht ? Da ich die Methode nicht kenne, schlage ich einfach mal bitblt vor. Der übergibst du einfach ein Canvas.handle und eine reihe von Parametern.

Mit Canvas habe ich schon seltsame, Probleme gehabt bzw, habe sie immer noch.
MFG
Michael Springwald

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: PaintTo

Beitrag von monta »

Unter Windows liefert mir PaintTo das komplette BarChart an das Bitmap, So das ich es anschließned komplett als Bild abspeichern kann. Unter Linux dagegen ist das resultierende Bitmap schlicht und einfach Schwarz. Es scheint so, als ob PaintTo einfach "nicht" macht.

BitBtl geht wohl, genauso wie CopyRect nicht.

Der BarChart liegt innerhlab einer Scrollbox. Das Problem ist nun, das die beiden genannten Funktionen aber nur den aktuell in der Scrollbar sichtbaren Ausschnitt des BarCharts abspeichern und eben nicht den ganzen. (BitBtl füllt den Restlichen Platz dann mit umliegendem Bildschirmhintergrund und schwarz).
Das Problem liegt eben darin, das ich das ganze BarChart haben möchte, was über die Standardcanvasfunktionen wohl nicht geht, da sich die auf den sichtbaren Teil beschränkt.
Johannes

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: PaintTo

Beitrag von pluto »

Versuch mal diesen Code:

Code: Alles auswählen

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  bmp:TBitMap;
begin
  bmp:=TBitMap.Create;
  bmp.Width:=BarChart1.Width;
  bmp.Height:=BarChart1.Height;
  BitBlt(bmp.Canvas.Handle,0,0,BarChart1.Width,BarChart1.Height,
         BarChart1.Canvas.Handle,0,0,SRCCOPY
        );
  bmp.SaveToFile('/home/pluto/Desktop/test.bmp');
end;
Bei mir klappt er einbandfrei. Ich bin unter KDE 3.5, Debian Lenny. Lazarus 0.9.27
MFG
Michael Springwald

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: PaintTo

Beitrag von monta »

Eben nicht.

Der Code an sich geht.
Aber, er speichert nur den sichtbaren Ausschnitt der Scrollbox. Ich habe den BarChart aber in einer Scrollbox, die einen großteil des Charts versteckt. Nun will ich aber eben nicht den Ausschnit, sondern den ganzen Chart haben ;)

Hab gerade nochmal PaintTo probiert, schwarz bleibt es doch nicht, aber es kommt totaler Mist dabei raus.
Johannes

Benutzeravatar
theo
Beiträge: 10925
Registriert: Mo 11. Sep 2006, 19:01

Re: PaintTo

Beitrag von theo »

Es gab mal einen Bug Report dazu. Konnte aber scheint's nicht reproduziert werden.
http://bugs.freepascal.org/view.php?id=13685" onclick="window.open(this.href);return false;
Vielleicht solltest du das Thema nochmal im Bugtracker auf den Tisch bringen.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6854
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: PaintTo

Beitrag von af0815 »

Mit 'PaintOnCanvas(ACanvas: TCanvas; ARect: TRect)' statt 'PaintTo' geht es nicht ? Damit solltest du in redraw auf deinem Canvas auslösen können.

Habe so ähnliche Probleme früher bei D gehabt, zusammen mit den ersten Chart Komponenten. Ich habe auch die Grafiken dann direkt als gestreamt am Webserver ausgegeben. Auch über den Umweg als bitmap, aber ohne sichtbare Oberflächen (cgi).
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: PaintTo

Beitrag von monta »

Kann es sein, das du TAChart meinst?

TBarChart hat glaube ich kein PaintOnCanvas.

(Ich möchte allerdings gerne TBarChart um das zusätzliche Package zu umgehen.)
Johannes

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6854
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: PaintTo

Beitrag von af0815 »

monta hat geschrieben:Kann es sein, das du TAChart meinst?

TBarChart hat glaube ich kein PaintOnCanvas.

(Ich möchte allerdings gerne TBarChart um das zusätzliche Package zu umgehen.)
Ja, ist korrekt, ich habe mich mit der TAChart beschäftigt.

In der BarChart gibt es aber die Property 'Canvas'. Die ändern und ein paint auslösen, ev. nacher wieder restaurieren. Wäre ev. eine Möglichkeit.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: PaintTo

Beitrag von monta »

Also die Division by Zero (#14190) in TBarChart konnte ich ja noch beheben aber hier geb ich langsam auf.

Also Bugreport:
http://bugs.freepascal.org/view.php?id=14201" onclick="window.open(this.href);return false;

Nochmal visuell die Unterschiede:
Unter Windows so wie es sein sollte:
BarChart_win.png
BarChart_win.png (3.13 KiB) 2423 mal betrachtet
Und unter Linux wird da irgendwie etwas völlig verschoben:
BarChart_linux.png
BarChart_linux.png (4.56 KiB) 2423 mal betrachtet
Demo siehe Bugreport, falls es jemanden interessiert.
In der BarChart gibt es aber die Property 'Canvas'. Die ändern und ein paint auslösen, ev. nacher wieder restaurieren. Wäre ev. eine Möglichkeit.
Kann ich mal probieren. Wenngleich ich der Ansicht bin, das ja eigentlich genau dafür PaintTo da sein sollte, ohne irgendwie umständlich am Canvas zu operieren.;)
Johannes

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: PaintTo

Beitrag von pluto »

Hast du unter Linux versucht, vorher ein FillRect auf deine TBitmap machen ?
Das ist nämlich unter Linux oft ein Fehler, beim TBitmap. Das dort anscheint die Pixel nicht vorinstallisiert werden. Weißt du wie ich meine ?

ps: Habe wohl die ScrollBox überlesen. Eigentlich müsste der Code auch unter Linux gehen, innerhalb eine Scrollbox.
MFG
Michael Springwald

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6854
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: PaintTo

Beitrag von af0815 »

Frage: Wenn du noch ein TImage auf die Form bringst und dort das Bitmap zeichnest, ist es dort ok?

Code

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
 
  procedure ChartToBmp(const BarChart: TBarChart);
  var
    Bitmap: TBitmap;
    TempCanvas : TCanvas;
  begin
    Bitmap := TBitmap.Create;
    try
      Bitmap.Width := BarChart.Width;
      Bitmap.Height := BarChart.Height;
      BarChart.PaintTo(Bitmap.Canvas, 0, 0);
      Image1.Picture.Bitmap.Assign(Bitmap);
      Image1.Width:= Bitmap.Width;
      Image1.Height:= Bitmap.Height;
    finally
      Bitmap.Free;
    end;
  end;
 
begin
  ChartToBmp(BarChart1);
end;
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: PaintTo

Beitrag von monta »

Nein, gibt auch Probleme.

Sieht zwar etwas anders aus, aber ebenso unbrauchbar.

Hab gerade gemerkt, wenn ich das Formular und somit die Scrollbar mit dem BarChart vergrößere, kommen die ersten Zeilen beim ersten Speichern noch brauchbar an. Aber der verdeckte Teil ist trotzdem zerstört, mal schwarz, mal gemustert.

Nach dem Vergrößern der erste Versuch liefert (in verschiedenen Variationen) das angehängte Bild, danach ist es wieder gänzlich zerstört, wenn man es ernaut speichern will.
Dateianhänge
Barchart.png
Johannes

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6854
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: PaintTo

Beitrag von af0815 »

monta hat geschrieben:Nein, gibt auch Probleme.
Ich habe derzeit kein einsatzfähiges Linux, aber es sieht so aus, als gäbe es Probleme mit dem partiellen Zeichnen. Ist es weg, wenn die Scrollbox nicht verwendet wird ? Sprich wenn das Fenster groß genug ist .

Die zweite Frage, ist es weg, wenn du die BarChart komplett nonvisual erzeugst und speicherst. Denn eigentlich willst du ja nur das Bild speichern.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: PaintTo

Beitrag von monta »

Also:
Mit deinem Code von oben zum Speichern:

- wenn die Scrollbox so groß ist, das keine Scrollbalken benötigt werden, funktioniert es einmal. Beim zweiten Versuch wird das Bild wieder zerstört. Außerdem wird der Barchart komischer Weise bei jedem Versuch einige Pixel breiter.

- Wenn ich es im Speicher erzeuge, geht gar nichts, die Bilder sind genau so zerstört.
Johannes

Antworten