加载图像从二进制在MFC

Load image from binary in MFC

本文关键字:MFC 二进制 图像 加载      更新时间:2023-10-16

通常我使用带路径的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);