c++ - 在 MFC 中从二进制加载图像

标签 c++ mfc

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

最佳答案

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

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

关于c++ - 在 MFC 中从二进制加载图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7184003/

相关文章:

c++ 你能命名子窗口以使其句柄静态吗?

c++ - 在 PropertyPage 上的控件上显示工具提示。将 TRUE 返回到 ON_NOTIFY_EX(TTN_NEEDTEXT...) 时崩溃

c++ - 将数据并行添加到 HashMap 中

c++ - 如何快速附加到 QTextEdit

c++ - MFC UI 线程中的进度条被阻止

c++ - 在与父进程相同的监视器上运行进程

c++ - DrawText 和文本裁剪

c++ - 为什么变量在 C++ 中的 for 循环后没有更新?

c++ - Microsoft.Cpp.Win32.Targets(62,5) : error : Required file "" is missing

c++ - 基于方法或自由函数的存在的模板构造函数解析