VC/MFC 以二进制读出jpg文件后 有没有办法将照片显示到主界面呢

jpg文件的大小为4k左右的,我把它以二进制的方式读出来,放到一个缓存里面去,我现在想利用缓存里面的内容将照片显示到主界面上去,有没有办法?我不想直接贴图。麻烦指教。我的... jpg文件的大小为4k左右的,我把它以二进制的方式读出来,放到一个缓存里面去,我现在想利用缓存里面的内容将照片显示到主界面上去,有没有办法?
我不想直接贴图。
麻烦指教。
我的主窗口时已经有了的,然后二进制的信息也已经读出来了,我想问的是,应该在主界面添加什么控件,然后用什么方法,可以将图片显示出来?
展开
 我来答
空雪梦见
推荐于2016-08-25 · TA获得超过5597个赞
知道大有可为答主
回答量:2522
采纳率:75%
帮助的人:1154万
展开全部
#include <windows.h>
#include <gdiplus.h>
#include <stdio.h>

using namespace Gdiplus;
Image* img;

LRESULT CALLBACK WndProc(HWND h, UINT m, WPARAM w, LPARAM l)
{
    if (m == WM_PAINT) {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(h, &ps);
        {
            Graphics g(hdc);
            g.DrawImage(img, 0, 0);
            g.Flush();
        }
        EndPaint(h, &ps);
        return 0;
    } else if (m == WM_NCDESTROY) {
        PostQuitMessage(0);
        return 0;
    } else
        return DefWindowProcA(h, m, w, l);
}

IStream* (__stdcall *SHCreateMemStream)(const char*, int);

int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
{
    SHCreateMemStream = (IStream* (__stdcall *)(const char*, int)) GetProcAddress(LoadLibraryA("shlwapi.dll"), (char*)12);
    
    //init gdi+
    ULONG_PTR gup;
    GdiplusStartupInput gsi;
    GdiplusStartup(&gup, &gsi, 0);
    
    //read jpg
    FILE *fp = fopen("pic.jpg", "rb");
    fseek(fp, 0, SEEK_END);
    int nFileSize = ftell(fp);
    fseek(fp, 0, SEEK_SET);
    char* pcontent = new char[nFileSize];
    fread(pcontent, 1, nFileSize, fp);
    fclose(fp);
    IStream* sContent = SHCreateMemStream(pcontent, nFileSize);
    delete[] pcontent;
    img = Image::FromStream(sContent, FALSE);
    sContent->Release();
    
    //show window
    WNDCLASSA wc;
    ZeroMemory(&wc, sizeof(wc));
    wc.lpfnWndProc = WndProc;
    wc.lpszClassName = "MyWin";
    wc.hInstance = hInst;
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.hbrBackground = (HBRUSH) COLOR_WINDOW;
    RegisterClassA(&wc);
    
    HWND h = CreateWindowA("MyWin", "4kjpg", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 100, 200, 0, 0, hInst, 0);
    ShowWindow(h, SW_SHOWNORMAL);
    UpdateWindow(h);
    
    MSG msg;
    while( GetMessageA(&msg, 0, 0, 0) > 0)
        DispatchMessageA(&msg);
        
    GdiplusShutdown(gup);
    return 0;
}

例子。注意代码里我没写返回值判断

更多追问追答
追问
我的主窗口是已经有了的,然后二进制的信息也已经读出来了,我想问的是,应该在主界面添加什么控件,然后用什么方法,可以将图片显示出来?
追答
我不知道你的代码是什么样也不知道你的工程是什么样

我写了一个完整的可编译运行最直观看到结果的示例代码,
居然变成这样的结果 -_,-

学过C语言认得fread么?认得那就知道数据已经全读入内存了
然后用这些数据创建IStream对象,为构建Image对象提供数据流
Image对象构建起来以后,就可以把Image对象往界面上画。
如果你要拿HBITMAP,只要把Image::FromStream改成Bitmap::FromStream,相应的数据类型改成Bitmap*就可以。Bitmap对象有一个GetHBITMAP方法,可以拿HBITMAP句柄。

不直接画要用控件显示,那么STATIC控件,用STM_SETIMAGE消息给它设定一个HBITMAP
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式