从SQL数据库到CImage的图像

问题描述:

我现在很挣扎,希望有人能帮助我。从SQL数据库到CImage的图像

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

感谢您的帮助!

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

欢迎来到Stack Overflow!你可以先参加[游览]并学习[问]一个很好的问题,然后创建一个[mcve]。这使我们更容易帮助你。 – Katie

+0

请告诉我们你到目前为止所尝试过的。什么没有用?另请阅读并遵循http://stackoverflow.com/help/how-to-ask –

的问题可以降低到加载从一个字节数组CImage,因为这是你从SQLGetData得到什么。

您没有指出是否意味着要使用ATL或MFC,但在这两种情况下都有点尴尬,因为没有public :: LoadFromBuffer函数。

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

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

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

编辑:所有迄今做过... https://stackoverflow.com/a/14035492/1132334https://stackoverflow.com/a/38710933/1132334

感谢所有的答复。根据@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 
    }