![]() |
Farbe aus einem Pixel bekommen.
Hi,
ich schreibe zurzeit an einem Programm mit dem ich einen Rot-Grün-3D Effekt erstelle. Dafür zeichne auf dem Canvas nacheinander zwei Würfel aus unterschiedlichen Blickwinkeln. Nun möchte ich, nach dem Zeichnen des ersten Würfels aufs Canvas zugreifen und die RGB Werte an einer bestimmten Position abgreifen, zB (120;200) und diese in einem Array speichern. Nach dem Zeichnen des zweiten Würfels das selbe Spiel: RGB-Werte an der bestimmten Posi abgreifen und Speichern. Danach verrechne ich die RGB Werte in einer Matritze miteinander und möchte den neuen RGB Wert zeichnen. So, zu meiner Frage: a) wie greife ich die RGB-Werte ab? b) Wie "zeichne" ich den neuen RGB-Wert? Mit der Berechnung habe ich keine Probleme.
Code:
Ich bin auf diese Funktion hier im Forum gestoßen, nur ist mir nicht ganz klar was ich in meine Procedure schreiben muss um diese Richtig nutzen zu können..
function GetPixel(Pos: TPoint): TColor;
var DC: HDC; Handle: HWND; begin Handle:=WindowFromPoint(Pos); DC:=GetDC(Handle); result:=Windows.GetPixel(DC, Pos.X, Pos.Y); ReleaseDC(Handle, DC); end; |
AW: Farbe aus einem Pixel bekommen.
Zitat:
![]() |
AW: Farbe aus einem Pixel bekommen.
Zitat:
- Ersteres ist total langsam (sowas macht man intern in einem TBitmap oder Dergleichen ... genannt Offscreen-Bitmap) - und Letzeres ist nicht für "Berechnungen" geeignet, da es die Bilddaten nirgends speichert. Und wozu die Arrays? zwei TBitmap für die Würfel und dann die Pixel direkt verrechnen, wobei es sogar eine fertige Copy-Methode gibt, welche das verrechnet. Bzw, brauchst du einfach nur via OR das eine Bild in das Andere reinkopieren, wenn das eine Bild nur Rot- und das Andere nur Grüntöne besitzt. |
AW: Farbe aus einem Pixel bekommen.
Und wenn du unbedingt nachträglich auf einzelne pixel zugreifen musts, nutze ScanLine und nicht PIxel, ScanLIne ist um einiges schneller.
MFG Memnarch |
AW: Farbe aus einem Pixel bekommen.
Zitat:
Anfänger sind mit Scanline häufig überfordert. Ausserdem kann Scanline seine Performance nur dann voll ausspielen, wenn man das Bitmap in horizontaler Richtung abarbeitet. |
AW: Farbe aus einem Pixel bekommen.
@shmia: ok geb ich recht, könnte überfordern.
Wenn torro oder sonst noch wer trotzdem interesse hat sich das mal anzugucken: ![]() Fand ich ganz gut erklärt(ist aber auf ENGLISH) MFG Memnarch |
AW: Farbe aus einem Pixel bekommen.
erstmal danke für die schnellen und vielen antworten.
hab es mit Pixels[] ausprobiert und es hat alls so funktioniert wie ich es brauche. vielen Dank :D |
AW: Farbe aus einem Pixel bekommen.
hi, wie ihr schon erwartet habt ist das ganze extrem langsam..
Code:
kann man diesen code beschleunigen? Ihr seht ich muss die Prozedur sogar zweimal ausführen. das ganze auf ein image zeichnen is nur eine notlösung..
procedure GetRGBlinks ();
VAR farbe : tcolor; r,g,b : byte; x, y: integer; begin x:=190; y:=-40; for x := 235 to 425 DO begin for y:= -40 to 135 DO begin farbe := form1.Canvas.Pixels[x,y]; b := farbe MOD 256; farbe := farbe DIV 256; g := farbe MOD 256; farbe := farbe DIV 256; r := farbe MOD 256; lWuerfel[x,y].b:=b; lWuerfel[x,y].g:=g; lWuerfel[x,y].r:=r; end; end; end; procedure GetRGBrechts var.. begin . . end; |
AW: Farbe aus einem Pixel bekommen.
Ja, mit
![]() |
AW: Farbe aus einem Pixel bekommen.
Zitat:
Ich hab es nicht umsonst gesagt. minimiere mal die Form oder schiebe mal kurz eine andere Form über deine Form drüber ... Ergebnis: das Bild ist weg. Ja, unter Windows 7 kann man Glück haben, daß der Desktop Window Manager eine Kopie der Daten vorhält, aber das ist nicht die Regel und diese Daten/Kopieen können auch schnell mal weg sein. Zum Bearbeiten intern ein TBitmap und zum Anzeigen dann z.B. ein TImage. Zitat:
Und du mußt aufpassen welches Format das Bitmap besitzt, da man direkt auf die internen Daten zugreift, welche sich ja je nach ![]() PS:
Delphi-Quellcode:
und dann läßt es sich immernoch auf ScanLine umstellen.
var
bild1, bild2: TBitmap; farbe1, farbe2 : record color : tcolor; b, g, r : byte; end; bild1 := TBitmap.Create; try bild2 := TBitmap.Create; try // bild1.canvas füllen // bild2.canvas füllen for x := ... do for y := ... do begin farbe1.color := bild1.Canvas.Pixel[x, y]; farbe2.color := bild2.Canvas.Pixel[x, y]; // farbe1.r, .b und .g mit farbe2 verrechnen // Ergebnis in farbe1 bild1.Canvas.Pixel[x, y] := farbe1.color; end Image1.Canvas.CopyRect(Image1.ClientRect, bild1.Canvas, Image1.ClientRect); finally bild2.Free; end; finally bild1.Free; end; Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz