Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Problem mit Tbitmap.canvas (https://www.delphipraxis.net/178782-problem-mit-tbitmap-canvas.html)

Gutelo 27. Jan 2014 13:10

Problem mit Tbitmap.canvas
 
Hallo,

ich habe ein Problem mit dem Setzen von TBitmap.canvas.Pixels.

Zunaechst erstelle ich ein leeres Bitmap mittels:

Code:
  bmp := TBitmap.Create;
  bmp.Width := VWidth;
  bmp.Height := VHeight;
  bmp.PixelFormat := pf32Bit;
Anschliessend wird der Hintergrund auf eine hellblau Farbe gesetzt und diverse Objekte (Rechtecke und Text) auf bmp.canvas gezeichnet. Die Objekte selbst haben brush und pen entweder auf clwhite oder clBlue, also das bild ist im wesentlichen blau/weiss. Nun will ich die Farbwerte der Pixel aendern so dass das Bild heller oder dunkler wird. Das mache ich folgendermassen:

Code:
  for Row := 0 to bmp.Height-1 do
  for Col := 0 to bmp.Width-1 do
  begin
    Zahl := bmp.Canvas.Pixels[Col,Row];
    blau := (Zahl shr 16) and $FF;
    gruen:= (Zahl shr 8) and $FF;
    rot := Zahl and $FF;
    bmp.Canvas.Pixels[Col,Row] := RGB(rot-10, gruen-10, blau-10);
  end;
Wenn ich mir die Originalwerte der Pixel ausgeben lasse dann stimmen die Werte. Nach dem Setzen der um 10 verringerten RGB Werte sieht das Bitmap total vermurkst aus. Alles original mit clBlue gezeichnete wird nicht dunkler sondern weiss. Bei original blauer Schrift wird die Schrift im wesentlichen weiss aber am Rand der Schrift schimmern cyan und mangenta durch.

Woran kann das liegen?

Gutelo

PS: ich weiss, dass diese Implementation langsam ist verglichen mit Scanlines. Diverse Scanline Codeschnipsel aus dem Internet produzieren aber genau den gleichen Effekt.


Edit: der Mangenta/Cyan Effekt scheint vom Antialiasing zu kommen, ein Screenshot und zoom in Graphikprogramm zeigt bereits roetlich/gruene Pixel

DeddyH 27. Jan 2014 13:17

AW: Problem mit Tbitmap.canvas
 
Was geschieht wohl, wenn der R-, G- oder B-Anteil kleiner als 10 ist, aber trotzdem einfach subtrahiert wird?

Gutelo 27. Jan 2014 13:18

AW: Problem mit Tbitmap.canvas
 
Dass Blau zu Weiss wird liegt bestimmt daran dass ich bei den Rot und Gruen Kanaelen den Wert 10 von 0 abziehe ...

DeddyH 27. Jan 2014 13:20

AW: Problem mit Tbitmap.canvas
 
Das wird dann zu 246, genau.

[edit] Wie ist es denn so?
Delphi-Quellcode:
bmp.Canvas.Pixels[Col,Row] := RGB(max(rot-10, 0), max(gruen-10, 0), max(blau-10, 0));
[/edit]
[edit2] Nee, vermutlich auch Quatsch, da müsste man ggf. erst nach integer casten. Dann doch lieber eine Abfrage voranstellen, das ist dann auch selbsterklärend.
Delphi-Quellcode:
if rot < 10 then
  rot := 0
else
  dec(rot, 10);
[/edit2]

baumina 27. Jan 2014 13:22

AW: Problem mit Tbitmap.canvas
 
Es gibt in der Unit GraphUtil die Funktion ColorAdjustLuma mit der man Farben heller/dunkler machen kann.

Gutelo 27. Jan 2014 13:26

AW: Problem mit Tbitmap.canvas
 
Baumina,

danke fuer den Tipp werde ich gleich mal ausprobieren :)


Edit: das klappt prima mit ColorAdjustLuma

himitsu 27. Jan 2014 13:37

AW: Problem mit Tbitmap.canvas
 
Und falls mal in TColor kein reiner RBG-Wert liegen könnte, dann vorher noch via Delphi-Referenz durchsuchenColorToRGB den Farbwert auflösen.


PS: GetRValue, GetBValue und GetGValue

Warum eigentlich "Zahl" und nicht "Farbe"?

Zitat:

Delphi-Quellcode:
:= RGB(max(rot-10, 0), max(gruen-10, 0), max(blau-10, 0));

Und ich würde die Berechnungen, der Übesichtlichkeit halber, mit in die Zuweisungen der Variablen rot/grun/blau verschieben.

Gutelo 27. Jan 2014 14:46

AW: Problem mit Tbitmap.canvas
 
"Zahl", damit ich die Variable wieder schneller aus dem bereits bestehenden Code rausschmeissen kann falls aktuelle Aenderungen rueckgaengig gemacht werden muessen :P

himitsu 27. Jan 2014 15:02

AW: Problem mit Tbitmap.canvas
 
Im Prinzip ist da ja ein RGB-Farbwert drin, drum dachte ich mir, man hätte die Variable besser nach dem benennen könne, was da drin steckt. (Aber OB, im ferneren Sinne ist das auch irgednwie eine Zahl)

PS: Ist die Überschrift nicht auch etwas falsch?
Du hattest doch schon mitbekommen, daß die Berechnung schon nicht stimmt, also schon bevor der Wert an den Canvas übergeben wird. :stupid:


Jaaaa, ich hör schon auf. :angle2;


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz