加载图像从二进制在MFC
Load image from binary in MFC
通常我使用带路径的loadadimage或带资源ID的LoadBitmap进行图像加载。但是现在目标图像资源存储在数据库(SQLite)中。那么我如何使用二进制数据直接(避免存储临时文件)从数据库中检索MFC?
这是我找到的解决方案,它在我的项目中运行良好。
1。
int CSqlite::retrieveBinaryData(int id , byte *pdata)
{
ASSERT(pdata != NULL);
int rc,size;
sqlite3_stmt * stmt;
sqlite3_prepare(dbh,"select id,content,size from images where id = ?",-1,&stmt,0);
sqlite3_bind_int(stmt,1,id);
rc = sqlite3_step(stmt);
if(rc == SQLITE_ROW)
{
num = sqlite3_column_int(stmt,0);
size = sqlite3_column_int(stmt,2);
byte *tmpdata = (byte * )sqlite3_column_blob(stmt,1);
memcpy(pdata,tmpdata,size);
return size;
}
return 0;
}
2。从上面的函数接收数据并将其转换为CBitmap,以便我们可以使用它。
byte *tdata = new BYTE[BMP_MAX_SIZE];
CSqlite *sq = new CSqlite("mysqlite.db");
int size = sq->retrieveBinaryDatas(myid,tdata);
/* using the resource mentioned by alfonso in the comment */
BITMAPFILEHEADER* bmfh;
bmfh = (BITMAPFILEHEADER*)tdata;
BITMAPINFOHEADER* bmih;
bmih = (BITMAPINFOHEADER*)(tdata + sizeof(BITMAPFILEHEADER));
BITMAPINFO* bmi;
bmi = (BITMAPINFO*)bmih;
void* bits;
bits = (void*)(tdata + bmfh->bfOffBits);
HDC hdc = ::GetDC(NULL);
HBITMAP hbmp = CreateDIBitmap(hdc, bmih, CBM_INIT, bits, bmi, DIB_RGB_COLORS) ;
::ReleaseDC(NULL, hdc);
delete tdata;
BITMAP bitmap;
CBitmap *bmpBackground = CBitmap::FromHandle(hbmp);
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 有根的二进制搜索树.保留与其父级的链接
- 多态二进制函数
- 正在读取二进制文件(is_open)
- visual在c++中将十进制数转换为二进制数
- C++十进制到二进制,如何转换
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 二进制搜索树叶数问题
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 为什么二进制搜索在我的测试中不起作用
- 重载==不适用于二进制树
- C++ MFC Libraries in Travis CI
- 正在尝试重载二进制搜索树分配运算符
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 带有数组键C++的二进制映射
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 如何在 mfc c++ 中流式传输.zip文件夹的二进制表示形式
- 加载图像从二进制在MFC