Seite 1 von 1

Pixel eines Bildes abscannen

Verfasst: 05.08.2006 03:02
von winduff
Hallo allerseits!

Nunja, vielleicht die bisher schwierigste Frage von mir:

Ich möchte von einem beliebigen Bild alle Pixel scannen und die HEX (oder RGB)-Werte der einzelnen Pixel auslesen....

Nun ist das möglich und wenn ja, wäre ich dankbar für die begehrte Antwort: Wie :allright:

Lg
Chris

Verfasst: 05.08.2006 03:06
von Deeem2031
Und wie liegt das Bild vor? Datei, Image, Sprite, ...?

Verfasst: 05.08.2006 03:12
von winduff
Als Datei, kann aber natürlich jenachdem davor eingelesen werden etc ;-)

Verfasst: 05.08.2006 03:22
von inc.
Raw RGB32 Bilder stehen im Speicher auf dem Kopf. Wenn das bei dir der Fall ist, dann erst ein GetDIBits_ anwenden.

'hbmp' ist das Handle deiner Bitmap, die ausgelesen werden soll.

Code: Alles auswählen

Macro Red24( a ) : ((a) & $FF) : EndMacro
Macro Green24( a ) : ((a) >> 8 & $FF ): EndMacro
Macro Blue24( a ) : ((a) >> 16) : EndMacro
bmpInfo.BITMAPINFOHEADER

Dim myRGB.l(BMP_height-1,BMP_width-1) ;/// die x Ebene ist hier die Höhe und die y Ebene die Breite!!

hdc = GetDC_(#NULL) ; 24Bit Screen
bmpInfo\biSize = SizeOf(BITMAPINFOHEADER)      ; Set up the bmp header info
bmpInfo\biWidth  = BMP_width
bmpInfo\biHeight = -BMP_height ; // Hier negativer Wert = Flip y axis
bmpInfo\biPlanes = 1
bmpInfo\biBitCount = 32
bmpInfo\biCompression = #BI_RGB

If GetDIBits_(hdc, hbmp, 0, BMP_height, @myRGB(), bmpInfo, #DIB_RGB_COLORS) ;// Bild wird hier in unser Array 'myRGB()' kopiert.

    For x = 0 To BMP_width-1 
        For y = 0 To BMP_height-1
            r  = Red24(myRGB(y,x))   : g  = Green24(myRGB(y,x))   : b  = Blue24(myRGB(y,x))
            MachWasMit(r) : MachWasMit(g) : MachWasMit(b)
        Next y
    Next x
EndIf




Deeem, du bist doch fit in ASM?
Könntest du mir helfen jene Schleife zum Auslesen der RGB24 Daten in einen Assembler Code umzuschreiben? :)

Verfasst: 05.08.2006 03:25
von winduff
hey, tausend dank!

schaus mir gleich mal an (oder geh schlafe :mrgreen: )

Schaut gut aus ;-)

Lg
Chris

Verfasst: 08.08.2006 16:49
von Didelphodon
Auch ein Weg:

Lade das entsprechende Bild dann öffne es als Output-Kanal und durchlaufe es zweidimensional (2 Schleifen). Mittels der Funktion Point(x,y) kannst Du die Farbwerte jedes einzelnen Pixels auslesen.

LG Didel.

Verfasst: 08.08.2006 18:11
von inc.
Didelphodon hat geschrieben:Mittels der Funktion Point(x,y) kannst Du die Farbwerte jedes einzelnen Pixels auslesen.
Sorry, aber genau das ist weitaus langsamer als die direkte Methode via der SpeicherArray-Auslesung oben. Sowohl PBs Point() als auch GetPixel_() aus der WinAPI sind sehr langsam. Selbst PointFast() braucht noch was länger und der ist schon recht fix.