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
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

)
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.