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

Anmelden zum Antworten