Create CImage from Byte array

后端 未结 4 778
面向向阳花
面向向阳花 2020-12-21 12:02

I need to create a CImage from a byte array (actually, its an array of unsigned char, but I can cast to whatever form is necessary). The byte array is in the fo

4条回答
  •  庸人自扰
    2020-12-21 12:34

    Thanks everyone, I managed to solve it in the end with your help. It mainly involved @tinman and @Roel's suggestion to use SetDIBitsToDevice(), but it involved a bit of extra bit-twiddling and memory management, so I thought I'd share my end-point here.

    In the code below, I assume that width, height and Bpp (Bytes per pixel) are set, and that data is a pointer to the array of RGB pixel values.

    // Create the header info
    bmInfohdr.biSize = sizeof(BITMAPINFOHEADER);
    bmInfohdr.biWidth = width;
    bmInfohdr.biHeight = -height;
    bmInfohdr.biPlanes = 1;
    bmInfohdr.biBitCount = Bpp*8;
    bmInfohdr.biCompression = BI_RGB;
    bmInfohdr.biSizeImage = width*height*Bpp;
    bmInfohdr.biXPelsPerMeter = 0;
    bmInfohdr.biYPelsPerMeter = 0;
    bmInfohdr.biClrUsed = 0;
    bmInfohdr.biClrImportant = 0;
    
    BITMAPINFO bmInfo;
    bmInfo.bmiHeader = bmInfohdr;
    bmInfo.bmiColors[0].rgbBlue=255;
    
    // Allocate some memory and some pointers
    unsigned char * p24Img = new unsigned char[width*height*3];
    BYTE *pTemp,*ptr;
    pTemp=(BYTE*)data;
    ptr=p24Img;
    
    // Convert image from RGB to BGR
    for (DWORD index = 0; index < width*height ; index++)
    {
        unsigned char r = *(pTemp++);
        unsigned char g = *(pTemp++);
        unsigned char b = *(pTemp++);   
    
        *(ptr++) = b;
        *(ptr++) = g;
        *(ptr++) = r;
    }
    
    // Create the CImage
    CImage im;
    im.Create(width, height, 24, NULL);
    
    HDC dc = im.GetDC();
    SetDIBitsToDevice(dc, 0,0,width,height,0,0, 0, height, p24Img, &bmInfo, DIB_RGB_COLORS);
    im.ReleaseDC();
    
    delete[] p24Img;
    

提交回复
热议问题