【问题标题】:Image from SQL Database to CImage从 SQL 数据库到 CImage 的图像
【发布时间】:2017-04-29 19:45:51
【问题描述】:

我现在很挣扎,希望有人可以帮助我。

我必须从 SQL 数据库(如 SQLGetData)中获取图像,然后将该数据转换为 CImage,以便我可以在我的程序中查看它。

感谢您的帮助!

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

【问题讨论】:

标签: c++ sql


【解决方案1】:

问题可以简化为从字节数组加载CImage,因为这是从SQLGetData 得到的。

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

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

它解释了如何从字节缓冲区创建位图结构并从那里构造 CImage。

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

编辑:之前都已经完成了...https://stackoverflow.com/a/14035492/1132334https://stackoverflow.com/a/38710933/1132334

【讨论】:

    【解决方案2】:

    感谢到目前为止的所有回复。根据@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
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-28
      • 2016-02-12
      • 2015-05-12
      • 2011-03-10
      相关资源
      最近更新 更多