Bild spiegelverkerht -> LoadImage & GetDIBits
-
Hallo,
wenn ich ein Bild via LoadImage lade und die Pixel ausgebe via GetDIBits, dann werdne die Bildinformationen gespiegelt ausgegeben.
Gibt es eine Möglichkeit das wieder rückgänig zu machen?
Ciao
-
Hab gefunden was ich gesucht habe:
siehe (*)
BITMAPINFO bmi; bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader); //Set the size bmi.bmiHeader.biWidth = width; bmi.bmiHeader.biHeight = -height; // (*) NEGATIVES VORZEICHEN!!! bmi.bmiHeader.biBitCount = __bm.bmBitsPixel; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biCompression = BI_RGB; bmi.bmiHeader.biSizeImage =0;// 32 * 5 * 5 / 8;
-
So stell mal hier einen Quellcode rein, der funktioniert:
BMP-Bild via LoadImage laden, via GetDIBits Pixel auslesen:
HDC dcImage; HBITMAP hBitmap = (HBITMAP)LoadImage( NULL, "c:\\mypicture.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE ); // create local dcImage = CreateCompatibleDC( GetDC( ::GetDesktopWindow())); HBITMAP hOldBitmap = (HBITMAP)SelectObject( dcImage, hBitmap ); BITMAPINFO __bmi; BITMAP __bm; GetObject( hBitmap, sizeof(BITMAPINFO), &__bmi ); GetObject( hBitmap, sizeof(BITMAP), &__bm ); //BitBlt( dcImage, 0, 0, 5, 5, dcImage, 0, 0, DSTINVERT ); int width = __bm.bmWidth; int height = __bm.bmHeight; BITMAPINFO bmi; bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader); //Set the size bmi.bmiHeader.biWidth = width; bmi.bmiHeader.biHeight = -height; // invert image bmi.bmiHeader.biBitCount = __bm.bmBitsPixel; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biCompression = BI_RGB; bmi.bmiHeader.biSizeImage = ((((__bm.bmWidth * bmi.bmiHeader.biBitCount) + 31) & ~31) / 8) * __bm.bmHeight; BYTE *pbBits = new BYTE[bmi.bmiHeader.biSizeImage]; long _c= GetDIBits( dcImage, hBitmap, 0, height, pbBits, &bmi, DIB_RGB_COLORS ); printf( "\nCopied: %i\n WidthBytes: %i", _c, __bm.bmWidthBytes ); for( int y=0; y < height; y++ ) { for( int x=0; x < width; x++ ) { BYTE *bytePixels = &pbBits[(y*__bm.bmWidthBytes)+(x*3)]; BYTE b = bytePixels[0]; BYTE g = bytePixels[1]; BYTE r = bytePixels[2]; printf( "\n %i, %i, %i", r,g,b ); }//for }//for printf( "\n----------\nfinished" ); getchar();
-
Denk an das
delete [] pbBits;
.
-
Hi, jep. das muss ich aber erst etwas später machen.
So noch eine kleine Frage:
----------------
Wie hängt GetDIBits und CreateDIBSection mit einander zusammen?Wenn ich ein HDC erstelle, über CreateCompatibleBitmap dem DC ein Bitmap zuweise und darauf via BitBlt ein Screenshot vom Desktop mache und speichere funktioniert alles wunderbar.
**Aber{/B] wenn ich hier GetDIBits() aufrufe funktioniert es nicht => Fehler!Ich kann momentan nur GetDIBits() benutzen, wenn ich ein Bild via LoadImage [b]mit dem attribut "LR_CREATEDIBSECTION"** lade. Entferne ich das attribut, schläng die FUnktion ebenfalls fehl.
Wie kann ich das beheben, sodass ich auch die Funktion(GetDIBits()) bei "normalen" HDC nutzen kann?

-
Is dieFrage nicht verständlich? Oder weiß es einfach keinder?
