AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Tbitmap.canvas

Ein Thema von Gutelo · begonnen am 27. Jan 2014 · letzter Beitrag vom 27. Jan 2014
Antwort Antwort
Gutelo

Registriert seit: 29. Sep 2013
152 Beiträge
 
#1

Problem mit Tbitmap.canvas

  Alt 27. Jan 2014, 13:10
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

Geändert von Gutelo (27. Jan 2014 um 13:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Problem mit Tbitmap.canvas

  Alt 27. Jan 2014, 13:17
Was geschieht wohl, wenn der R-, G- oder B-Anteil kleiner als 10 ist, aber trotzdem einfach subtrahiert wird?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Gutelo

Registriert seit: 29. Sep 2013
152 Beiträge
 
#3

AW: Problem mit Tbitmap.canvas

  Alt 27. Jan 2014, 13:18
Dass Blau zu Weiss wird liegt bestimmt daran dass ich bei den Rot und Gruen Kanaelen den Wert 10 von 0 abziehe ...
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Problem mit Tbitmap.canvas

  Alt 27. Jan 2014, 13:20
Das wird dann zu 246, genau.

[edit] Wie ist es denn so?
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]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (27. Jan 2014 um 13:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Problem mit Tbitmap.canvas

  Alt 27. Jan 2014, 13:22
Es gibt in der Unit GraphUtil die Funktion ColorAdjustLuma mit der man Farben heller/dunkler machen kann.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Gutelo

Registriert seit: 29. Sep 2013
152 Beiträge
 
#6

AW: Problem mit Tbitmap.canvas

  Alt 27. Jan 2014, 13:26
Baumina,

danke fuer den Tipp werde ich gleich mal ausprobieren


Edit: das klappt prima mit ColorAdjustLuma

Geändert von Gutelo (27. Jan 2014 um 14:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.157 Beiträge
 
Delphi 12 Athens
 
#7

AW: Problem mit Tbitmap.canvas

  Alt 27. Jan 2014, 13:37
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:
:= 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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (27. Jan 2014 um 13:43 Uhr)
  Mit Zitat antworten Zitat
Gutelo

Registriert seit: 29. Sep 2013
152 Beiträge
 
#8

AW: Problem mit Tbitmap.canvas

  Alt 27. Jan 2014, 14:46
"Zahl", damit ich die Variable wieder schneller aus dem bereits bestehenden Code rausschmeissen kann falls aktuelle Aenderungen rueckgaengig gemacht werden muessen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.157 Beiträge
 
Delphi 12 Athens
 
#9

AW: Problem mit Tbitmap.canvas

  Alt 27. Jan 2014, 15:02
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.


Jaaaa, ich hör schon auf. :angle2;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:58 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