求助读取jpeg图象的源代码,并要求在打开文件对话框中有图象预览功能 求助读取jpeg图象的源代码,并要求在打开文件对话框中有图象预览功能,如果解决问题,给300分 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 IPicture *pPicture;//声明OLE提供的图像对象 IStream *pStrm;//声明一个流对象 CFileStatus fstatus; CFile file; LONG cb; if((file.Open(filename1,CFile::modeRead))&&(file.GetStatus(filename1,fstatus))&&((cb=fstatus.m_size)!=-1)) { HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,cb); LPVOID pvData=NULL; CDC *pDC; pDC=(this->GetActiveWindow())->GetDC();//得到活动视图的设备上下文 if(hGlobal!=NULL) { if((pvData=GlobalLock(hGlobal))!=NULL) { file.Read(pvData,cb);//将图像文件数据读入内存 GlobalUnlock(hGlobal); CreateStreamOnHGlobal(hGlobal,TRUE,&pStrm);//创建流对象 if(SUCCEEDED(OleLoadPicture(pStrm,fstatus.m_size,TRUE,IID_IPicture, (LPVOID*)&pPicture))) //根据流对象pStrm初始化图像对象pPicture { OLE_XSIZE_HIMETRIC Width; OLE_YSIZE_HIMETRIC Height; pPicture->get_Width(&Width); pPicture->get_Height(&Height); //得到图像的宽、高尺寸,注意该尺寸的逻辑单位不是图像的像素 if(FAILED(pPicture->Render(*pDC,8,12,300,200,0,Height,Width,-Height,NULL))) //在初始点(100,50)宽为200、高为150的矩形中显示图形 AfxMessageBox("Failed to render the picture"); pPicture->Release(); } else AfxMessageBox("Error loadimg picture from stream!"); } } } 预览类似,网上很多带预览BMP对话框的,改成预览jpg的就可以了 要载入JPGE图象文件首先要Intel的网站上去下载Intel JPEG Library,这个库包含了开发文档和例程,以及你不感兴趣的东西。我们真正要的是IJL.H,IJL15.LIB,和IJL15.DLL文件。一旦你拥有了这些文件,包含IJL.H头文件到你的代码文件中,添加IJL15.LIB文件到你的工程,并且确定IJL15.DLL文件是在有效的位置,如C:\Windows\Sysstem文件夹,当然,也可以跟我们编译出来的程式执行档放置于同一文件夹。 Intel JPEG Library可以到Intel官方网站上下载 可以用GDI+ ,预览跟bmp一样的 IPicture 和IStream 就可以实现显示BMP,JPG,GIF,TIF等,我把例子放进www.tom.com的信箱里了,用户名:mycsdn2003密码111111,主题:显示图片,你看看吧, BOOL CSdiApp::ShowPIC(CDC *pDC, CString strPath, CRect rect){ //显示BMP JPG GIF等格式的图片 IStream *pStm; CFileStatus fstatus; CFile file; LONG cb; HGLOBAL hGlobal; //打开文件并检测文件的有效性 if (file.Open(strPath,CFile::modeRead)&& file.GetStatus(strPath,fstatus)&& ((cb = fstatus.m_size) != -1)) { hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb); LPVOID pvData = NULL; if (hGlobal != NULL) { pvData = GlobalLock(hGlobal); if (pvData != NULL) { file.ReadHuge(pvData, cb); GlobalUnlock(hGlobal); CreateStreamOnHGlobal(hGlobal, TRUE, &pStm); } } } else { return false; } //打开文件结束 //显示JPEG和GIF格式的图片,GIF只能显示一帧,还不能显示动画, //要显示动画GIF请使用ACTIVE控//件。 IPicture *pPic; //load image from file stream if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic))) { OLE_XSIZE_HIMETRIC hmWidth; OLE_YSIZE_HIMETRIC hmHeight; pPic->get_Width(&hmWidth); pPic->get_Height(&hmHeight); double fX,fY; //得到图片的高度与宽度 fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/ ((double)pDC->GetDeviceCaps(HORZSIZE)*100.0); fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/ ((double)pDC->GetDeviceCaps(VERTSIZE)*100.0); //用 Render函数显示图片 if(FAILED(pPic->Render(*pDC,rect.left,rect.top ,rect.Width(),rect.Height(),0, hmHeight,hmWidth,-hmHeight,NULL))) { pPic->Release(); return false; } pPic->Release(); } else { return false; } //释放内存 GlobalUnlock(hGlobal); GlobalFree(hGlobal); return true;} 还好是 JPG ,要是 TIF、PNG 或其它格式,就非得用 GDI+ 不可了。 我关于BaseLine的JPEG压缩的最后一个问题(这个解决了我就能自己写JPEG压缩/解压代码了):---------------------------------------------前一个DC是指哪一个DC?如下两个MCU块:================= 0:Y 1:Y 2:Y 3:Y 4:Cb 5:Cr----- 6:Y 7:Y 8:Y 9:Y10:Cb11:Cr================编号为6的Y分量子块的前一个子块是哪一个?A.5号B.3号C.0号 ijl15有内存泄露的,高级的版本又不是免费的,还是用IPicture或者GDI+好了 新手求助:select * into from 语句的问题。 捕获关机消息的老问题? 对话框添加控件修改之后编译不能通过 关于孙鑫老师的视频 第15课中最后一个简单的聊天程序中的一个问题 用BDGRID控件生成的CMsDgirdCtrl类的问题 推荐一下好的,稳定的VC插件 发布一个p2p通讯的代码,希望对大家有用 高手请进:VC编写的服务器程序在win2000advanced server的群集服务中不能应用。 IsDirty函数得不到框架页里的改动,都返回S_FALSE 为何CreateWindow函数总返回空值?? 是不是分不够呀 COM组件错误信息...
IStream *pStrm;//声明一个流对象
CFileStatus fstatus;
CFile file;
LONG cb;
if((file.Open(filename1,CFile::modeRead))&&(file.GetStatus(filename1,fstatus))&&((cb=fstatus.m_size)!=-1))
{
HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,cb);
LPVOID pvData=NULL;
CDC *pDC;
pDC=(this->GetActiveWindow())->GetDC();//得到活动视图的设备上下文
if(hGlobal!=NULL)
{
if((pvData=GlobalLock(hGlobal))!=NULL)
{
file.Read(pvData,cb);//将图像文件数据读入内存
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal,TRUE,&pStrm);//创建流对象
if(SUCCEEDED(OleLoadPicture(pStrm,fstatus.m_size,TRUE,IID_IPicture,
(LPVOID*)&pPicture))) //根据流对象pStrm初始化图像对象pPicture
{
OLE_XSIZE_HIMETRIC Width;
OLE_YSIZE_HIMETRIC Height;
pPicture->get_Width(&Width);
pPicture->get_Height(&Height);
//得到图像的宽、高尺寸,注意该尺寸的逻辑单位不是图像的像素
if(FAILED(pPicture->Render(*pDC,8,12,300,200,0,Height,Width,-Height,NULL)))
//在初始点(100,50)宽为200、高为150的矩形中显示图形
AfxMessageBox("Failed to render the picture");
pPicture->Release();
}
else
AfxMessageBox("Error loadimg picture from stream!");
}
}
}
预览类似,网上很多带预览BMP对话框的,改成预览jpg的就可以了
{
//显示BMP JPG GIF等格式的图片
IStream *pStm;
CFileStatus fstatus;
CFile file;
LONG cb;
HGLOBAL hGlobal;
//打开文件并检测文件的有效性
if (file.Open(strPath,CFile::modeRead)&&
file.GetStatus(strPath,fstatus)&&
((cb = fstatus.m_size) != -1))
{
hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
pvData = GlobalLock(hGlobal);
if (pvData != NULL)
{
file.ReadHuge(pvData, cb);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
}
}
}
else
{
return false;
}
//打开文件结束
//显示JPEG和GIF格式的图片,GIF只能显示一帧,还不能显示动画,
//要显示动画GIF请使用ACTIVE控//件。
IPicture *pPic;
//load image from file stream
if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
double fX,fY;
//得到图片的高度与宽度
fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/
((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/
((double)pDC->GetDeviceCaps(VERTSIZE)*100.0); //用 Render函数显示图片
if(FAILED(pPic->Render(*pDC,rect.left,rect.top ,rect.Width(),rect.Height(),0,
hmHeight,hmWidth,-hmHeight,NULL)))
{
pPic->Release();
return false;
}
pPic->Release();
}
else
{
return false;
}
//释放内存
GlobalUnlock(hGlobal);
GlobalFree(hGlobal);
return true;
}
前一个DC是指哪一个DC?
如下两个MCU块:
=================
0:Y
1:Y
2:Y
3:Y
4:Cb
5:Cr
-----
6:Y
7:Y
8:Y
9:Y
10:Cb
11:Cr
================
编号为6的Y分量子块的前一个子块是哪一个?
A.5号
B.3号
C.0号