GDI+缩放图像后保存,图像就糊了,不知道该怎么解决? 我要把内存DC上的数据保存成jpg,我通过GDI+,可是保存后就模糊了,要是图象经过缩放,模糊的就更加厉害,不知道该怎么解决? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不对吧,gdi+只能缩小图片保存,放大图片存储还是原来大小。缩小后确实变糊了,估计跟没有重采样有关 gdi+直接存为jpg不会变糊,除非你设定的压缩比太高。 代码我粘出来,真的变模糊,只要在上面作图,然后保存,肯定模糊:bool CMyWnd::SaveToJpg{ CClientDC dc(this); if(dc.m_hDC) { CDC MemDC; CBitmap MemBmp; CRect r; GetClientRect(&r); int oldMode = dc.SetStretchBltMode(COLORONCOLOR); if(!MemDC.CreateCompatibleDC(&dc)) return FALSE; if(!MemBmp.CreateCompatibleBitmap(&dc,r.Width(), r.Height())) return FALSE; MemDC.SelectObject(&MemBmp); /*********************************************************/ //绘图 MemDC.Draw3dRect(CRect(10,10,200,200),0xFF0000,0xFF0000); //写字 CFont ft; ft.CreatePointFont(120,"宋体"); CFont *pOldFt = MemDC.SelectObject(&ft); int oldMode = MemDC.SetBkMode(TRANSPARENT); MemDC.SetTextColor(0xFF); MemDC.TextOut(100,100,"为什么变模糊?"); MemDC.SetBkMode(oldMode); MemDC.SelectObject(pOldFt); ft.DeleteObject(); /*********************************************************/ dc.SetStretchBltMode(oldMode); CPalette *pPalette = dc.GetCurrentPalette(); Bitmap *pBitmap = NULL; if(pPalette) pBitmap = Bitmap::FromHBITMAP(MemBmp,*pPalette); else pBitmap = Bitmap::FromHBITMAP(MemBmp,NULL); if(pBitmap) { CLSID PicClsid; GetEncoderClsid(L"image/jpeg",&PicClsid); pBitmap->Save(L"d:\\temp.jpg", &PicClsid, NULL); } MemDC.DeleteDC(); MemBmp.DeleteObject(); } return TRUE;} 其中: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} 聊天程序的一些问题~!~!~ 什么宏可以判断VS工程是静态库还是动态库 c++ 怎么写一个定时器?~ 请教PNG8位索引色中IDAT部分的数据结构 为什么我在OnPaint中用LineTO() 不能画出我指定颜色的线? vc三问,百分求解! 简单问题,无穷困扰 用POP3 TOP命令收来的邮件主题为?gb2312?B?tKbA7bbgsPwucmFy? 怎样转换为汉字?最好给出算法谢谢! 如何在HTMLVIEW中实现数据的POST? 如何能够查询到程序中某一个指定的线程的状态? 请问WPE 是什么呀。。做什么用的呀。。那里可以找到。。。 请问对话框右上的那个X,是不是IDCANCEL啊?
缩小后确实变糊了,估计跟没有重采样有关
{
CClientDC dc(this);
if(dc.m_hDC)
{
CDC MemDC;
CBitmap MemBmp;
CRect r;
GetClientRect(&r);
int oldMode = dc.SetStretchBltMode(COLORONCOLOR);
if(!MemDC.CreateCompatibleDC(&dc))
return FALSE;
if(!MemBmp.CreateCompatibleBitmap(&dc,r.Width(), r.Height()))
return FALSE;
MemDC.SelectObject(&MemBmp);
/*********************************************************/
//绘图
MemDC.Draw3dRect(CRect(10,10,200,200),0xFF0000,0xFF0000);
//写字
CFont ft;
ft.CreatePointFont(120,"宋体");
CFont *pOldFt = MemDC.SelectObject(&ft);
int oldMode = MemDC.SetBkMode(TRANSPARENT);
MemDC.SetTextColor(0xFF);
MemDC.TextOut(100,100,"为什么变模糊?");
MemDC.SetBkMode(oldMode);
MemDC.SelectObject(pOldFt);
ft.DeleteObject();
/*********************************************************/
dc.SetStretchBltMode(oldMode);
CPalette *pPalette = dc.GetCurrentPalette();
Bitmap *pBitmap = NULL;
if(pPalette)
pBitmap = Bitmap::FromHBITMAP(MemBmp,*pPalette);
else
pBitmap = Bitmap::FromHBITMAP(MemBmp,NULL);
if(pBitmap)
{
CLSID PicClsid;
GetEncoderClsid(L"image/jpeg",&PicClsid);
pBitmap->Save(L"d:\\temp.jpg", &PicClsid, NULL);
}
MemDC.DeleteDC();
MemBmp.DeleteObject();
}
return TRUE;
}
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
}