Pixel eines Bildes abscannen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
winduff
Beiträge: 879
Registriert: 10.02.2006 21:05
Wohnort: Gießen
Kontaktdaten:

Pixel eines Bildes abscannen

Beitrag 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
Bild
AND51 hat geschrieben:...und ich würde dein Programm aus Wut zwei mal installieren, um eines genüsslicher löschen zu können, als das andere...
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Und wie liegt das Bild vor? Datei, Image, Sprite, ...?
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
winduff
Beiträge: 879
Registriert: 10.02.2006 21:05
Wohnort: Gießen
Kontaktdaten:

Beitrag von winduff »

Als Datei, kann aber natürlich jenachdem davor eingelesen werden etc ;-)
Bild
AND51 hat geschrieben:...und ich würde dein Programm aus Wut zwei mal installieren, um eines genüsslicher löschen zu können, als das andere...
Benutzeravatar
inc.
Beiträge: 348
Registriert: 27.10.2004 12:25

Beitrag 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? :)
Zuletzt geändert von inc. am 05.08.2006 03:33, insgesamt 2-mal geändert.
Hier gibts die OOP Option für PureBasic.
Benutzeravatar
winduff
Beiträge: 879
Registriert: 10.02.2006 21:05
Wohnort: Gießen
Kontaktdaten:

Beitrag von winduff »

hey, tausend dank!

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

Schaut gut aus ;-)

Lg
Chris
Bild
AND51 hat geschrieben:...und ich würde dein Programm aus Wut zwei mal installieren, um eines genüsslicher löschen zu können, als das andere...
Benutzeravatar
Didelphodon
Beiträge: 360
Registriert: 18.12.2004 13:03
Wohnort: Wien
Kontaktdaten:

Beitrag 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.
Das Leben ist ein sch*** Spiel, aber die Grafik ist irre!
Fighting for peace is like fuc*ing for virginity!
Benutzeravatar
inc.
Beiträge: 348
Registriert: 27.10.2004 12:25

Beitrag 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.
Hier gibts die OOP Option für PureBasic.
Antworten