说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

VC中如何对JPEG文件进行编辑(例如挖取其中的一块显示出来)?

编辑:说三道四文库 发布时间:2018-04-20 05:44
HTML文档下载 WORD文档下载 PDF文档下载
兄弟再做一个控件,涉及到以上内容,底子太薄,无从下口,用VB作了一个,夹在一幅图像要2分钟,大虾出手啊。
文件名, 加载到一个DC上, 长, 宽
够简单了吧:)
然后用BitBlt挖出你想要的。

BOOL LoadPic(const char *picName, CDC &dc, DWORD w, DWORD h)
{
IPicture *pPic;
IStream *pStm;

CFileStatus fstatus;
CFile file;
LONG cb;

if (file.Open(picName,CFile::modeRead)&&
file.GetStatus(picName, fstatus)&&
((cb = fstatus.m_size) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
file.ReadHuge(pvData, cb);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);

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

DWORD fX, fY;

fX = (DWORD)((double)dc.GetDeviceCaps(HORZRES)*(double)hmWidth/
 ((double)dc.GetDeviceCaps(HORZSIZE)*100.0) * 1.512f);
fY = (DWORD)((double)dc.GetDeviceCaps(VERTRES)*(double)hmHeight/
 ((double)dc.GetDeviceCaps(VERTSIZE)*100.0) * 1.512f);

DWORD top=0, left=0;
if (w!=0 && h!=0)
{
if (fX >= w)
fX = w;
else
left = (w-fX)/2;
if (fY >= h)
fY = h;
else
top = (h-fY)/2;
}
if(FAILED(pPic->Render(dc,left,top,fX,fY,0,hmHeight,hmWidth,-hmHeight,NULL)))
{
#ifdef _DEBUG
TRACE("\nFailed To Render The picture!");
#endif
return FALSE;
}
pPic->Release(); 

else
{
#ifdef _DEBUG
TRACE("\nError Loading Picture From Stream!");
#endif
return FALSE; 
}
}
}
}
else
{
#ifdef _DEBUG
TRACE("\nCan't Open Image File!");
#endif
return FALSE;
}

return TRUE;
}
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘