如何从内存中显示图片...

chxy85 2009-03-31 09:31:57
是这样的,现在从文件中读取出了JPG图片,如果写入到文件中,再用SHLoadImageFile()能顺利显示到static中,

问题是现在只需要显示出来,并不需要写入文件,用上面的方法不但写入还得最后删除,各位大侠有没有什么办法从内存中显示JPG图片,现在有的是保存图片的字符串地址和长度。

似乎获得图片的句柄就行了,但是现在不知道怎么获得,小弟新人...不懂的地方还望高手指教
...全文
321 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
nvip 2011-05-08
  • 打赏
  • 举报
回复
用 FreeImage 可以方便解决这个问题
dzq138 2011-02-24
  • 打赏
  • 举报
回复
http://wenku.baidu.com/view/cdb2735abe23482fb4da4c6f.html
http://www.wotsit.org/download.asp?f=erdas&sc=351834264
dzq138 2011-02-12
  • 打赏
  • 举报
回复
参照上面兄弟的代码,成功了.

#include <imaging.h>
#include <initguid.h>
#include <imgguids.h>

void CradjpgDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CDialog::OnPaint()
CFile file;
CFileException fe;
CString FileName ;
DWORD dwFileLength;
BYTE* pBuff;

FileName=L"\\Storage Card\\GPSHZ\\Map2010\\1-11-7.jpg";
if(0 == file.Open(FileName, CFile::modeRead | CFile::shareDenyWrite, &fe)) //打开文件
{
AfxMessageBox(L"打开文件失败");
return ;
}
dwFileLength = file.GetLength(); //取得文件总长度
pBuff=new BYTE[dwFileLength];
file.Seek(0 ,CFile::begin); //定位
file.Read((BYTE*)(pBuff) , dwFileLength); //读字节
file.Close();

IImagingFactory *pImgFactory = NULL;
IImage *pImage = NULL;
HRESULT hrCoInit;
HDC hdcCont=NULL,hdcMem=NULL;
ImageInfo pimageinfo;//= new sizeof(ImageInfo);
RECT rect;
//pImgFactory->CreateBitmapFromBuffer( );
//if(FAILED(pImagingFactory->CreateImageFromBuffer(byData,dwLen,BufferDisposalFlag::BufferDisposalFlagCoTaskMemFree,&pImage)))goto End;

//ImageInfo imgInfo;

//使用IImagingFactory的CreateImageFromBuffer获取IImage指针时,需要注意参数的设置,
//只有在第三个参数为BufferDisposalFlagNone时才能使用Release,不然会报内存错误。
//如果参数为BufferDisposalFlagGlobalFree,则图片内存需要使用GlobalFree来释放(GlobalFree的使用要注意)。
//if (FAILED(hrCoInit=CoInitializeEx(NULL, COINIT_MULTITHREADED)))goto End;
//if(FAILED(CoCreateInstance(CLSID_ImagingFactory,NULL,CLSCTX_INPROC_SERVER,IID_IImagingFactory,(void**) &pImagingFactory)))goto End;
hrCoInit=CoInitializeEx(NULL, COINIT_MULTITHREADED);
CoCreateInstance(CLSID_ImagingFactory,NULL,1,IID_IImagingFactory,(void**) &pImgFactory);
pImgFactory->CreateImageFromBuffer(pBuff,dwFileLength,BufferDisposalFlag::BufferDisposalFlagCoTaskMemFree,&pImage);
pImage->GetImageInfo( &pimageinfo);
rect.top =0;
rect.left =0;
rect.right =pimageinfo.Width ;
rect.bottom =pimageinfo.Height ;

pImage->Draw(dc,&rect,NULL);
pImgFactory->Release();
pImage->Release();
delete pBuff;

}



dzq138 2011-02-12
  • 打赏
  • 举报
回复
同问呀.因为太多的JPG文件,所以合到一下文件了.读的时候可以读到内存段.
显示,不想再写一下JPG的文件再读取..
兄弟有解决的,说说.....
即内存块中的JPG文件数据如何在CE中显示.
MS_Frank 2009-04-01
  • 打赏
  • 举报
回复
下面代码将常用图片转换为标准位图,然后SendMessage(picHwnd, STM_SETIMAGE, IMAGE_BITMAP, tBitmap));就可以了。

/*
* 下载并转换图像为标准位图格式
* 成功返回宽(低字节),高(高字节),失败返回0
*/
LONG ConvertImage(LPCTSTR lpstrImgUrl,HBITMAP *hBitmap)
{
CHttpRequest httpRequ;
if(!InitHttpRequest(&httpRequ))return FALSE;

//下载图片
if(!httpRequ.OpenConnect(lpstrImgUrl,CHttpRequest::RequestType::GET))return FALSE;
if(!httpRequ.SendRequest())return FALSE;

DWORD dwLen=0;
BYTE *byData=NULL;
if(!httpRequ.ReadData(NULL,&dwLen))return FALSE;
byData=new BYTE[dwLen];
if(!httpRequ.ReadData(byData,&dwLen)) goto End;

///解码图像
LONG lRetn=0;
IImage *pImage=NULL;
IImagingFactory *pImagingFactory=NULL;
HRESULT hrCoInit;
HDC hdcCont=NULL,hdcMem=NULL;

if (FAILED(hrCoInit=CoInitializeEx(NULL, COINIT_MULTITHREADED)))goto End;
if(FAILED(CoCreateInstance(CLSID_ImagingFactory,NULL,CLSCTX_INPROC_SERVER,IID_IImagingFactory,(void**) &pImagingFactory)))goto End;
if(FAILED(pImagingFactory->CreateImageFromBuffer(byData,dwLen,BufferDisposalFlag::BufferDisposalFlagCoTaskMemFree,&pImage)))goto End;

ImageInfo imgInfo;
if(FAILED(pImage->GetImageInfo(&imgInfo)))goto End;

//将解码后的图像画入内存DC中
hdcCont=GetDC(NULL);
*hBitmap=CreateCompatibleBitmap(hdcCont,imgInfo.Width,imgInfo.Height);
hdcMem=CreateCompatibleDC(hdcCont);
SelectObject(hdcMem,*hBitmap);
RECT rect={0,0,imgInfo.Width,imgInfo.Height};
pImage->Draw(hdcMem,&rect,NULL);

//返回位置的宽,高
lRetn=MAKELONG(imgInfo.Width,imgInfo.Height);

End:
if(hdcMem)DeleteDC(hdcMem);
if(hdcCont)DeleteDC(hdcCont);
if(pImage)pImage->Release();
if(pImagingFactory)pImagingFactory->Release();
if(byData)delete[] byData;
if(SUCCEEDED(hrCoInit))CoUninitialize();

return lRetn;
}
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 biosli 的回复:]
查查CreateBitmapFromBuffer,看看MSDN
[/Quote]
同意
PinkDream20070628 2009-03-31
  • 打赏
  • 举报
回复
你当然需要自己写头文件的啊,不然怎么让其他进程认识啊.
chxy85 2009-03-31
  • 打赏
  • 举报
回复
是这样的,我没解释清楚,是从文件中只读取了其中一段数据,然后把这段数据写入另一个jpg文件,然后用SHLoadImageFile是没有问题,
但是我现在想做的是从文件中只读取了其中一段数据,然后就显示出来,没有写成文件,因此也没有文件名,问题就在这里...........
Kevenshao 2009-03-31
  • 打赏
  • 举报
回复
UP
Kevenshao 2009-03-31
  • 打赏
  • 举报
回复
UP
zhwen968 2009-03-31
  • 打赏
  • 举报
回复
友情顶过
世外涛缘 2009-03-31
  • 打赏
  • 举报
回复
既然能从文件中读出JPG文件,就用一个全局变量保存它。
这样不就保存在内存中了么,在需要的时候访问这个全局变量就可以了。
在程序退出时,对这个变量析构。
cytlyy 2009-03-31
  • 打赏
  • 举报
回复
SHLoadImageFile返回的就是图片的句柄啊。肯定要删除不然会内存泄漏。
binbinneu 2009-03-31
  • 打赏
  • 举报
回复
用IImage组件,IImagingFactory接口的createImagefrombuffer函数
世外涛缘 2009-03-31
  • 打赏
  • 举报
回复
用流来初始化ICON可以不?这样就可以显示了。
Icon(Stream) 看看这个构造函数。
binbinneu 2009-03-31
  • 打赏
  • 举报
回复
帮顶,同问,就是图片的数据在一个数组里面,包括文件头等等,想用这个数组直接将图片显示出来,应该怎么做啊?图片格式是JPG,GIF或者为PNG
biosli 2009-03-31
  • 打赏
  • 举报
回复
查查CreateBitmapFromBuffer,看看MSDN
yihan7h 2009-03-31
  • 打赏
  • 举报
回复
必须是jpg么?
如果是bmp就比较容易了,自己操作数据创建一张bmp

7,655

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧