[gelöst] Grauenvolle grüne Kreise auf weißem Hintergrund

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
kirchfritz
Beiträge: 172
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 3.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

[gelöst] Grauenvolle grüne Kreise auf weißem Hintergrund

Beitrag von kirchfritz »

Hallo,

erstmal entschuldige ich mich für den reisserischen Titel dieses Beitrags.
Aber ich möchte ebenhalt Aufmerksamkeit erreichen.

Ich versuche in einem StringGrid im OnDrawCell-Event grüne Kreise auf weißem Hintergrund zu zeichnen.
Dies gelingt mir auch mit folgenden Programmzeilen:

Code: Alles auswählen

    with TStringGrid(Sender) do
    begin
	 Canvas.Brush.Color := clWhite;
         Canvas.FillRect(aRect);
         Canvas.Brush.Color := clGreen;
         Canvas.Pen.Color := clWhite;
         Canvas.Pen.Style := psClear;
         Canvas.Ellipse(aRect.Left+10,aRect.Top+10,aRect.Left+48,aRect.Top+48);
    end;
  
Das Ergebnis schaut leider suboptimal aus.
Die Kreisränder sind grauenvoll "ausgefranst".
Auch das Setzen von Canvas.AntialiasingMode auf "amOn" ändert daran nicht.
Mein Frage: Wie macht man's besser?

Ich bin unter Windows unterwegs und verwende Lazarus 2.2.2
Fritz
Zuletzt geändert von kirchfritz am Mo 12. Sep 2022, 16:34, insgesamt 1-mal geändert.

kirchfritz
Beiträge: 172
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 3.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Re: Grauenvolle grüne Kreise auf weißem Hintergrund

Beitrag von kirchfritz »

Und hier mal ein ScreenShot meines "Problems" im Anhang
Dateianhänge
GrueneKreise.png
GrueneKreise.png (20.73 KiB) 842 mal betrachtet

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

Re: Grauenvolle grüne Kreise auf weißem Hintergrund

Beitrag von theo »

Ich finde, so sieht schon mal besser aus:

Code: Alles auswählen

  with TStringGrid(Sender) do
  begin
       Canvas.Brush.Color := clWhite;
       Canvas.FillRect(aRect);
       Canvas.Brush.Color := clGreen;
       Canvas.Pen.Color := clGreen;
       Canvas.Ellipse(aRect.Left+10,aRect.Top+10,aRect.Left+48,aRect.Top+48);
  end;   
lazcirc.png
lazcirc.png (936 Bytes) 834 mal betrachtet

Sonst vllt. BGRABitmap oder direkt von einem PNG laden.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1435
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Grauenvolle grüne Kreise auf weißem Hintergrund

Beitrag von fliegermichl »

im internationalen Forum habe ich dazu gefunden:
Antialiasing mode does not work on Windows.

The reason is that the Tcanvas is using GDI under the hood to draw and GDI does not support anti-aliased mode for graphics. you need to use a different engine eg GDI+ or use the aggpas library that comes with lazarus for painting on a buffer and copy that buffer to the image afterwards, although I think that there is a rasterizer for tbimaps included with aggpas.

kirchfritz
Beiträge: 172
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 3.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

[Gelöst] Grauenvolle grüne Kreise auf weißem Hintergrund

Beitrag von kirchfritz »

Ich habe in meinen Code nun eine BGRABitmap verwendet:

Code: Alles auswählen

{
       StrgGrid.Canvas.Brush.Color := clGreen;
       StrgGrid.Canvas.Pen.Color := clWhite;
       StrgGrid.Canvas.Pen.Style := psClear;
       StrgGrid.Canvas.Ellipse(aRect.Left+10,aRect.Top+10,aRect.Left+48,aRect.Top+48);
}
       image := TBGRABitmap.Create(38,38,clWhite);
       image.FillEllipseAntialias(19,19,18,18,clGreen);
       image.Draw(StrgGrid.Canvas,aRect.Left+10,aRect.Top+10,false);
       image.Free;     
Das Ergebnis ist PERFEKT! Siehe Anhang
GrueneKreise_Optimal.png
GrueneKreise_Optimal.png (22.77 KiB) 768 mal betrachtet

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

Re: Grauenvolle grüne Kreise auf weißem Hintergrund

Beitrag von theo »

Schön!
Ich würde das jetzt einmal beim OnCreate machen, statt bei jedem StringGrid1DrawCell Event.
Dort nur noch

Code: Alles auswählen

image.Draw(StrgGrid.Canvas,aRect.Left+10,aRect.Top+10,false);

kirchfritz
Beiträge: 172
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 3.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

[Gelöst] Grauenvolle grüne Kreise auf weißem Hintergrund

Beitrag von kirchfritz »

Danke theo!

Ich hab's umgesetzt.
Funktioniert wunderbar.

Mein Problem war: Ich habe mich nicht an die BGRABitmaps ran getraut. Weiß auch nicht warum.
Jetzt habe ich diese Scheu verloren und bin glücklich. Wenigstens für heute.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: [Gelöst] Grauenvolle grüne Kreise auf weißem Hintergrund

Beitrag von Winni »

kirchfritz hat geschrieben:
Do 1. Sep 2022, 13:41
Danke theo!

Ich hab's umgesetzt.
Funktioniert wunderbar.

Mein Problem war: Ich habe mich nicht an die BGRABitmaps ran getraut. Weiß auch nicht warum.
Jetzt habe ich diese Scheu verloren und bin glücklich. Wenigstens für heute.
Hi!

Bravo! Bei BGRAbitmap mit einfachen Dingen anfangen.
Und wenn's zu kompliziert wird: fragen.
Ich antworte gerne.

Und für alle:
Wenn die LCL wieder mal zu eingeschränkt ist in ihren Möglichkeiten:
BGRAbitmap nehmen!

Winni

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Grauenvolle grüne Kreise auf weißem Hintergrund

Beitrag von Winni »

Hallo!

Ich zeig mal, wie man mit der Änderung von FillEllipseAntialias die grünen Kreise weiter verhübscht.

Stattdessen :

Code: Alles auswählen

image.FillEllipseLinearColorAntialias (19, 19, 18, 18, CSSDarkGreen, CSSGreenYellow);   
Macht einen radialen Verlauf von CssDarkGreen nach CSSGrenYellow.

Die CSS-Farben stehen in der Unit BGRAbitmapTypes, also diese einbinden.

Winni
Dateianhänge
gradient.png
gradient.png (1.34 KiB) 659 mal betrachtet

Antworten