如何将DC中的内容保存为JPG文件?

wyljery 2005-07-29 07:57:55
不想使用GDI+,JPG文件越小越好。

搞了几天都没搞出来,在网上也没找到类似的程序,郁闷。
...全文
348 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
naughtybomb23 2005-07-30
  • 打赏
  • 举报
回复
XX
bravo1980 2005-07-30
  • 打赏
  • 举报
回复
不用GDI+的话,只有剩下的几个选择:CImageEx ImageObject JpegLib。
个人认为GDI+最好,快且易用。
bravo1980 2005-07-30
  • 打赏
  • 举报
回复
GDIPLUS中有个Bitamp类,你可以利用它把DC转成JPG,我给出大概的代码。

CDC dcMem;
CBitmap* pOldBmp;
CBitmap bmSave;
pOldBmp=dcMem.SelectObject(&bmSave);

HBITMAP hSave=bmSave.Detach();
Bitmap bmGdiPlus(hSave,.......);
CLSID pngClsid;
GetEncoderClsid(L"image/jpeg", &pngClsid);
bmGdiplus.Save(szwJpgFile, &pngClsid, NULL); // szwWpgFile为WCHAR



INT GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
UINT num = 0; // number of image encoders
UINT size = 0; // size of the image encoder array in bytes

ImageCodecInfo* pImageCodecInfo = NULL;

GetImageEncodersSize(&num, &size);
if(size == 0)
return -1; // Failure

pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return -1; // Failure

GetImageEncoders(num, size, pImageCodecInfo);

for(UINT j = 0; j < num; ++j)
{
if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
{
*pClsid = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return j; // Success
}
}

free(pImageCodecInfo);
return -1; // Failure
}
oyljerry 2005-07-30
  • 打赏
  • 举报
回复
不用GDI+,可以用CXImage等类好了
dirdirdir3 2005-07-30
  • 打赏
  • 举报
回复
不用GDI+就用其他的库吧,intel的ijl
legendhui 2005-07-30
  • 打赏
  • 举报
回复
http://www.vckbase.com/document/viewdoc/?id=1028
http://www.vckbase.com/document/viewdoc/?id=802
teli_eurydice 2005-07-30
  • 打赏
  • 举报
回复
请问 DC 保存为 BMP 的怎么做 ,GDI
billy145533 2005-07-30
  • 打赏
  • 举报
回复
给个不用gdi+的理由
没有新的sdk吗
handsomerun 2005-07-29
  • 打赏
  • 举报
回复
晕,不好意思,没看到是要jpg文件

呵呵,看了看以前的工程,有个vb工程,也是保存成jpg文件的,发现也是用的GDI+的
handsomerun 2005-07-29
  • 打赏
  • 举报
回复
把桌面抓图以后,保存成文件的代码

CDC dc;
dc.CreateDC("DISPLAY",NULL,NULL,NULL);
CBitmap bm;
int Width=GetSystemMetrics(SM_CXSCREEN);
int Height=GetSystemMetrics(SM_CYSCREEN);
bm.CreateCompatibleBitmap(&dc,Width,Height);
CDC tdc;
tdc.CreateCompatibleDC(&dc);
CBitmap*pOld=tdc.SelectObject(&bm);
tdc.BitBlt(0,0,Width,Height,&dc,0,0,SRCCOPY);
tdc.SelectObject(pOld);
BITMAP btm;
bm.GetBitmap(&btm);
DWORD size=btm.bmWidthBytes*btm.bmHeight;
LPSTR lpData=(LPSTR)GlobalAllocPtr(GPTR,size);
/////////////////////////////////////////////
BITMAPINFOHEADER bih;
bih.biBitCount=btm.bmBitsPixel;
bih.biClrImportant=0;
bih.biClrUsed=0;
bih.biCompression=0;
bih.biHeight=btm.bmHeight;
bih.biPlanes=1;
bih.biSize=sizeof(BITMAPINFOHEADER);
bih.biSizeImage=size;
bih.biWidth=btm.bmWidth;
bih.biXPelsPerMeter=0;
bih.biYPelsPerMeter=0;

GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
bm.GetBitmapBits(size,lpData); static int filecount=0;
CString name = "pic.bmp";
BITMAPFILEHEADER bfh;
bfh.bfReserved1=bfh.bfReserved2=0;
bfh.bfType=((WORD)('M'<< 8)|'B');
bfh.bfSize=54+size;
bfh.bfOffBits=54;
CFile bf;
if(bf.Open(name,CFile::modeCreate|CFile::modeWrite)){
bf.WriteHuge(&bfh,sizeof(BITMAPFILEHEADER));
bf.WriteHuge(&bih,sizeof(BITMAPINFOHEADER));
bf.WriteHuge(lpData,size);
bf.Close();
nCount++;
}
GlobalFreePtr(lpData);
AntonlioX 2005-07-29
  • 打赏
  • 举报
回复
CxImage 一样用来很容易的啊
flyelf 2005-07-29
  • 打赏
  • 举报
回复
有gdi+,干什么不用呢
qrlvls 2005-07-29
  • 打赏
  • 举报
回复
参考 CxImage
http://www.codeproject.com/bitmap/cximage.asp
不过用 GDI+ 是比较简单的方法

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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