HBITMAP erzeugen
-
Hallo ich habe folgenden Code, der einen QR Code erzeugt.
Leider nur als *.bmp Datei.
Ich möchte nun eine HBITMAP haben die ich auf dem Bildschirm anzeigen und auf dem Drucker ausdrucken kann.
Nun zum Code:if (pQRC = QRcode_encodeString(szSourceSring, 0, QR_ECLEVEL_H, QR_MODE_8, 1)) { unWidth = pQRC->width; unWidthAdjusted = unWidth * OUT_FILE_PIXEL_PRESCALER * 3; if (unWidthAdjusted % 4) unWidthAdjusted = (unWidthAdjusted / 4 + 1) * 4; unDataBytes = unWidthAdjusted * unWidth * OUT_FILE_PIXEL_PRESCALER; // Allocate pixels buffer if (!(pRGBData = (unsigned char*)malloc(unDataBytes))) { printf("Out of memory"); exit(-1); } // Preset to white memset(pRGBData, 0xff, unDataBytes); // Prepare bmp headers BITMAPFILEHEADER kFileHeader; kFileHeader.bfType = 0x4d42; // "BM" kFileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + unDataBytes; kFileHeader.bfReserved1 = 0; kFileHeader.bfReserved2 = 0; kFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); BITMAPINFOHEADER kInfoHeader; kInfoHeader.biSize = sizeof(BITMAPINFOHEADER); kInfoHeader.biWidth = unWidth * OUT_FILE_PIXEL_PRESCALER; kInfoHeader.biHeight = -((int)unWidth * OUT_FILE_PIXEL_PRESCALER); kInfoHeader.biPlanes = 1; kInfoHeader.biBitCount = 24; kInfoHeader.biCompression = BI_RGB; kInfoHeader.biSizeImage = 0; kInfoHeader.biXPelsPerMeter = 0; kInfoHeader.biYPelsPerMeter = 0; kInfoHeader.biClrUsed = 0; kInfoHeader.biClrImportant = 0; // Convert QrCode bits to bmp pixels pSourceData = pQRC->data; for(y = 0; y < unWidth; y++) { pDestData = pRGBData + unWidthAdjusted * y * OUT_FILE_PIXEL_PRESCALER; for(x = 0; x < unWidth; x++) { if (*pSourceData & 1) { for(l = 0; l < OUT_FILE_PIXEL_PRESCALER; l++) { for(n = 0; n < OUT_FILE_PIXEL_PRESCALER; n++) { *(pDestData + n * 3 + unWidthAdjusted * l) = PIXEL_COLOR_B; *(pDestData + 1 + n * 3 + unWidthAdjusted * l) = PIXEL_COLOR_G; *(pDestData + 2 + n * 3 + unWidthAdjusted * l) = PIXEL_COLOR_R; } } } pDestData += 3 * OUT_FILE_PIXEL_PRESCALER; pSourceData++; } } // Output the bmp file if (!(fopen_s(&f, OUT_FILE, "wb"))) { fwrite(&kFileHeader, sizeof(BITMAPFILEHEADER), 1, f); fwrite(&kInfoHeader, sizeof(BITMAPINFOHEADER), 1, f); fwrite(pRGBData, sizeof(unsigned char), unDataBytes, f); fclose(f); }
Kann mir da mal jemand helfen, ich stehe irgendwie auf dem Schlauch.
Danke.
-
Der einfachste Weg wäre vermutlich
HBITMAP CreateBitmapIndirect( const BITMAP *lpbm );
Wobei eine device-dependent bitmap erzeugt wird.
Die Doku weist darauf hin, das man bei Farbimages aus performancegründen einen etwas umständlicheren Weg gehen soll:
While the CreateBitmapIndirect function can be used to create color bitmaps, for
performance reasons applications should use CreateBitmapIndirect to create monochrome
bitmaps and CreateCompatibleBitmap to create color bitmaps.Das könnte auf eine Kombination aus CreateCompatibleBitmap(), SetDIBits() sowie evtl. noch BitBlt() hinauslaufen. Möglicherweise gehts auch einfacher.
-
Danke für deine Antwort.
Hast du eventuell ein kleines Beispiel?
BITMAP bit; bit.bmType =0; bit.bmBitsPixel=1; bit.bmHeight=((int)unWidth * OUT_FILE_PIXEL_PRESCALER); bit.bmWidth=unWidth * OUT_FILE_PIXEL_PRESCALER; bit.bmPlanes=1; bit.bmBits=pRGBData; bit.bmWidthBytes=2; HBITMAP bm = 0; bm = CreateBitmapIndirect(&bit);
Ich habs hiermit probiert, aber ich bekommen als HBITMAP immer NULL.
-
papa_multi schrieb:
Danke für deine Antwort.
Hast du eventuell ein kleines Beispiel?
BITMAP bit; bit.bmType =0; bit.bmBitsPixel=1; bit.bmHeight=((int)unWidth * OUT_FILE_PIXEL_PRESCALER); bit.bmWidth=unWidth * OUT_FILE_PIXEL_PRESCALER; bit.bmPlanes=1; bit.bmBits=pRGBData; bit.bmWidthBytes=2; HBITMAP bm = 0; bm = CreateBitmapIndirect(&bit);
Ich habs hiermit probiert, aber ich bekommen als HBITMAP immer NULL.
Der Wert für bmWidthBytes müsste vermutlich unWidthAdjusted und nicht 2 sein.
Ansätze für diue andere Lösung finden z.b. hier:
http://www.c-plusplus.net/forum/39400
-
Danke der Fall ist gelöst.
Für alle die es interessiert:kInfoHeader.biHeight = ((int)unWidth * OUT_FILE_PIXEL_PRESCALER);// das minus muß weg sonst wir das Bild gespiegelt HBITMAP bm = CreateDIBSection(GetDC(0), (BITMAPINFO*)&kInfoHeader, DIB_RGB_COLORS, (void**)pRGBData, 0, 0); SetBitmapBits( bm, kInfoHeader.biHeight * (kInfoHeader.biWidth*kInfoHeader.biBitCount+31)/32*4, pRGBData );