从SQL数据库到CIMAGE的图像

Image from SQL Database to CImage

本文关键字:图像 CIMAGE SQL 数据库      更新时间:2023-10-16

我目前正在挣扎,希望有人可以帮助我。

我必须从SQL数据库中获得图像(例如使用SQLGETDATA),而不是将数据转换为CIMAGE,以便我可以在程序中查看它。

感谢您的帮助!

SQLGetData(m_Hstmt, col, SQL_C_BINARY, BinaryPtr, 0, &cbData)

可以将问题简化为从字节数组加载CImage,因为那是您从SQLGetData获得的。

您没有说明您是要使用ATL还是MFC,但是在这两种情况下,这都有点尴尬,因为没有公开的东西:: LoadFrombuffer函数。

这个答案应该做:https://stackoverflow.com/a/6759701/1132334

它说明了如何从字节缓冲区创建位图结构并从那里构造一个cimage。

如果您需要处理不同的图片格式,这将很棘手。在这种情况下,将原始字节写入内存映射的文件,然后使用CImage::Load(IStream*) Overload。

edit :全部完成了...>

感谢到目前为止的所有答复。以@dlatikay的答案,这是我到目前为止的代码。但是我不确定类型,以某种方式我的图像保持黑色(当我将其保存到文件系统时)

到目前为止,我的代码是我的代码。

SQLLEN    cbData;
CImage    image;
BYTE* imgBits;
    m_Rc = SQLGetData(m_Hstmt, 1, SQL_C_BINARY, imgBits, 0, &cbData);

    if (SQL_SUCCEEDED(m_Rc))
    {
        width = 317;
        height = 159;
        BITMAPINFOHEADER bmInfohdr;
        // Create the header info
        bmInfohdr.biSize = sizeof(BITMAPINFOHEADER);
        bmInfohdr.biWidth = width;
        bmInfohdr.biHeight = -height;
        bmInfohdr.biPlanes = 1;
        bmInfohdr.biBitCount = 8 * 8;
        bmInfohdr.biCompression = BI_RGB;
        bmInfohdr.biSizeImage = width*height * 8;
        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*)imgBits;
        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
        image.Create(width, height, 8, NULL);
        image.Save(_T("c:\temp\image1.bmp")); // for testing
    }