从SQL数据库到CImage的图像
问题描述:
我现在很挣扎,希望有人能帮助我。从SQL数据库到CImage的图像
我必须从SQL数据库中获取图像(如使用SQLGetData),并将该数据转换为CImage,以便在程序中查看它。
感谢您的帮助!
SQLGetData(m_Hstmt, col, SQL_C_BINARY, BinaryPtr, 0, &cbData)
答
的问题可以降低到加载从一个字节数组CImage
,因为这是你从SQLGetData
得到什么。
您没有指出是否意味着要使用ATL或MFC,但在这两种情况下都有点尴尬,因为没有public :: LoadFromBuffer函数。
这个答案应该做的: https://stackoverflow.com/a/6759701/1132334
它说明了如何创建一个从字节的缓冲区的位图结构,并从那里构造的CImage。
如果你需要处理不同的图片格式,这将是棘手。在这种情况下,将原始字节写入内存映射文件,然后使用CImage::Load(IStream*)
过载。
编辑:所有迄今做过... https://stackoverflow.com/a/14035492/1132334和https://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
}
欢迎来到Stack Overflow!你可以先参加[游览]并学习[问]一个很好的问题,然后创建一个[mcve]。这使我们更容易帮助你。 – Katie
请告诉我们你到目前为止所尝试过的。什么没有用?另请阅读并遵循http://stackoverflow.com/help/how-to-ask –