Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Farbe aus einem Pixel bekommen. (https://www.delphipraxis.net/159322-farbe-aus-einem-pixel-bekommen.html)

torro 23. Mär 2011 10:48

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:
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;
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..

shmia 23. Mär 2011 11:06

AW: Farbe aus einem Pixel bekommen.
 
Zitat:

Zitat von torro (Beitrag 1090431)
...Dafür zeichne auf dem Canvas ...

Dann nimm doch einfach das Property Pixels[] deines Canvas-Objekts.

himitsu 23. Mär 2011 11:18

AW: Farbe aus einem Pixel bekommen.
 
Zitat:

Dafür zeichne auf dem Canvas
Doch nicht etwa das Canvas von einem TImage oder gar das der TForm?
- 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.

Memnarch 23. Mär 2011 11:32

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

shmia 23. Mär 2011 12:47

AW: Farbe aus einem Pixel bekommen.
 
Zitat:

Zitat von Memnarch (Beitrag 1090439)
Und wenn du unbedingt nachträglich auf einzelne pixel zugreifen musts, nutze ScanLine und nicht PIxel

Aber erst nachdem die Lösung mit Pixels[] funktioniert hat.
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.

Memnarch 23. Mär 2011 13:57

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:

http://edn.embarcadero.com/article/29173

Fand ich ganz gut erklärt(ist aber auf ENGLISH)

MFG
Memnarch

torro 23. Mär 2011 16:07

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

torro 23. Mär 2011 17:47

AW: Farbe aus einem Pixel bekommen.
 
hi, wie ihr schon erwartet habt ist das ganze extrem langsam..

Code:
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;
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..

turboPASCAL 23. Mär 2011 18:10

AW: Farbe aus einem Pixel bekommen.
 
Ja, mit Hier im Forum suchenScanline. Dazu musst du aber ein TBitmap nutzen.

himitsu 23. Mär 2011 18:54

AW: Farbe aus einem Pixel bekommen.
 
Zitat:

form1.Canvas
:wall:
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:

Zitat von turboPASCAL (Beitrag 1090545)
Ja, mit Hier im Forum suchenScanline. Dazu musst du aber ein TBitmap nutzen.


Und du mußt aufpassen welches Format das Bitmap besitzt, da man direkt auf die internen Daten zugreift, welche sich ja je nach Delphi-Referenz durchsuchenPixelFormat unterscheidet.

PS:
Delphi-Quellcode:
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;
und dann läßt es sich immernoch auf ScanLine umstellen.

Zitat:

Delphi-Quellcode:
for y:= -40 to 135 DO

das -40 ist wohl total falsch, denn ein Bitmap hat keine negativen Pixel (sei froh, daß bei dir keine Bereichsprüfung aktiv ist)

torro 23. Mär 2011 19:14

AW: Farbe aus einem Pixel bekommen.
 
Zitat:

Zitat von himitsu (Beitrag 1090562)

Zitat:

Delphi-Quellcode:
for y:= -40 to 135 DO

das -40 ist wohl total falsch, denn ein Bitmap hat keine negativen Pixel (sei froh, daß bei dir keine Bereichsprüfung aktiv ist)


Ne, ist es nicht. Wie gesagt erzeuge ich auf dem Canvas zwei Würfel. Die Würfel werden auf Basis von Vektoren errechnet und der aktuellen Blickwinkel entsprechend gezeichnet. Dazu habe ich u.a. das Koordinatensystem in die Mitte des Forms legen müssen. Deswegen kommt der Wert -40 zustande. -40 ist eine der Koordinaten auf denen der Würfel gezeichnet wird.

Ich werde jetzt erstmal probieren eure Vorschläge umzusetzen

turboPASCAL 24. Mär 2011 03:32

AW: Farbe aus einem Pixel bekommen.
 
Du versuchst jetzt aber nicht irgend ein 3D
Dings zu bauen ? Dann würde ich eher zu
OpenGL raten.

Bummi 24. Mär 2011 06:13

AW: Farbe aus einem Pixel bekommen.
 
Liste der Anhänge anzeigen (Anzahl: 1)
Für einen Anaglyphen muß er ja nicht auf OpenGL zrückgreifen....
Ich hatte vor einiger Zeit den Anhang schon mal gepostet, finde ihn aber nicht mehr, daher nochmals, vielleicht kannst Du es ja brauchen.
Der schnellste Zugriff für Deinen Fall wäre IMHO der unter Button4Click über FastPixel.
Zwei gleich große Bitmaps und beim Kombinieren jeweils 2 Bytes in ein Word addieren, shr 1 und in das Byte des Zielbitmaps (zurück)schreiben.

Memnarch 24. Mär 2011 08:47

AW: Farbe aus einem Pixel bekommen.
 
@turboPascal: Och warum nich? Mal selbst nen bisschen 3d Basics zu machen schadet nicht, wen man mal mit OpenGL&Co arbeiten möchte. Ich hab mal nen kleinen Softwareratserizer in Delphi geschrieben.

Projectthread im Externen Forum(3dsg-Hobbyschmiede)

MFG
Memnarch

torro 24. Mär 2011 08:58

AW: Farbe aus einem Pixel bekommen.
 
Zitat:

Zitat von turboPASCAL (Beitrag 1090623)
Du versuchst jetzt aber nicht irgend ein 3D
Dings zu bauen ? Dann würde ich eher zu
OpenGL raten.

Doch, tue ich. Die Mathematik dahinter ist ja recht simpel.

rollstuhlfahrer 24. Mär 2011 14:44

AW: Farbe aus einem Pixel bekommen.
 
Hast du den Code eigentlich mal durchlaufen lassen und dir das Ergebnis angeschaut? - Alles was < 0 ist, gibt es gar nicht (es wird nicht gezeichnet, also gleich wieder verworfen). Du kannst aber dann deine TImages gerne nach x=-40 verschieben. Denen macht das nix.

Bernhard

torro 24. Mär 2011 20:49

AW: Farbe aus einem Pixel bekommen.
 
Ja habe ich. und ich weis dass es die Koordinate -40 gibt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:33 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