在 MFC 中从二进制文件加载图像

Posted

技术标签:

【中文标题】在 MFC 中从二进制文件加载图像【英文标题】:Load image from binary in MFC 【发布时间】:2011-08-25 00:59:17 【问题描述】:

通常我使用带有路径的LoadImage 或带有资源ID 的LoadBitmap 进行图像加载。但是现在目标图像资源存储在数据库(SQLite)中。那么如何直接使用(避免存储临时文件)从 MFC 中的 db 中检索到的二进制数据?

【问题讨论】:

查看this question的第一个答案 【参考方案1】:

这是我找到的解决方案,它在我的项目中运行良好。

1.从sqlite数据库中检索二进制数据的函数。

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); 

【讨论】:

以上是关于在 MFC 中从二进制文件加载图像的主要内容,如果未能解决你的问题,请参考以下文章

从二进制获取图像尺寸和图像大小

Dask 从二进制文件中读取数据

从二进制数据流中构造GDAL能够读取的图像数据

使用和不使用 NI Vision 从二进制缓冲区/文件创建 LabVIEW IMAQ 图像

使用 MMX 指令集计算 f(x)=2*(x^2)+5 饱和度,用于从二进制文件加载的 128 个大小为 2 字节的数字

在python中如何从二进制文件中读取信息