VC/MFC 以二进制读出jpg文件后 有没有办法将照片显示到主界面呢
jpg文件的大小为4k左右的,我把它以二进制的方式读出来,放到一个缓存里面去,我现在想利用缓存里面的内容将照片显示到主界面上去,有没有办法?我不想直接贴图。麻烦指教。我的...
jpg文件的大小为4k左右的,我把它以二进制的方式读出来,放到一个缓存里面去,我现在想利用缓存里面的内容将照片显示到主界面上去,有没有办法?
我不想直接贴图。
麻烦指教。
我的主窗口时已经有了的,然后二进制的信息也已经读出来了,我想问的是,应该在主界面添加什么控件,然后用什么方法,可以将图片显示出来? 展开
我不想直接贴图。
麻烦指教。
我的主窗口时已经有了的,然后二进制的信息也已经读出来了,我想问的是,应该在主界面添加什么控件,然后用什么方法,可以将图片显示出来? 展开
1个回答
展开全部
#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
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询