概述
VC++显示图片:
2天的学习,48小时终于搞定了,
简单说一下,最初本来是要用vc显示图片的,
dc.draw(...); 就解决了,
随着项目的进展,图片需要保存,
dc.selectobject(&bmp);
savebmp(bmp, "c:a.bmp");
本想这样就完成了呗,后来发现转PDF需要用JPG
那么好了,又找了一个类CIMAGE
CIMAGE img;
img.load("c:a.bmp");
img.safe("c:a.jpg"); 搞定,结果打开一下,
失身,哦,不是,是“失真”,太严重了,
又找了一个牛人写的safejpg,过程太曲折了,几十个小时过去了
CIMAGE img;
img.load("c:a.bmp");
img.safejpeg("c:a.jpg", 100); 第二个参数是清晰度
勉强能见人吧,失真不是很严重,勉强能看;
接下来做吧,本来就是后台程序我这个是依靠界面出来的活,
咋办啊,找到了孙鑫老师11课代码,找到了 cMetaFileDc,
m_DcMetafile.Create( "c:\Create.wmf" );
m_DcMetafile.SetTextColor( 0xFF);
m_DcMetafile.TextOut( 0, 0, "我是MetaFile");
HMETAFILE hmetfile;
hmetfile = m_DcMetafile.Close();
//保存兼容DC
CopyMetaFile(hmetfile, "c:\CopyMetaFile.wmf");
一看效果很好,
只是格式wmf的,要装pdf 的话路相当曲折了,
再转念一想CDC能在界面显示为什么不能在内存中显示
于是出现了内存绘图的代码
CDC memdc;
memdc.CreateCompatibleDC( &m_DcMetafile );
memdc.PlayMetaFile(hmetfile);
播放出了wmf文件,
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&m_DcMetafile,rect.Width(),rect.Height());
memdc.SelectObject( &bitmap);
然后执行
safejpeg(bitmap, "c:ok.jpg");
//出来的效果是我要的, 可是就是只有一个颜色
别着急再顺顺思路:
//1.创建兼容DC
CDC memdc;
memdc.CreateCompatibleDC( dc );
//2.创建BMP 位图 (CSDN)上说创建的空位图导致的就是单色的结果
/*http://bbs.csdn.net/topics/90080731*/
CBitmap bmp;
bmp.CreateCompatibleBitmap( memdc, 400, 566);
//3.选择位图
memdc.SelectObject( &bmp );
//4.写字
memdc.textout(0,0,"0k");
//5.保存JPG
safejpeg(bitmap, "c:ok.jpg");
打开看一下,一个色
最后找到方法了,只需要修改bmp关联的兼容位图就搞定了,
创建一个和dc关联的bmp,而不是很memdc关联的cbitmap对象,
其实这个方法 fishjam 已经在 csdn 上说过了,只是我一直看不出端倪
最后摸索出跟人家一样的结果,唉,,惭愧啊
http://blog.csdn.net/fishjam/article/details/7400627
---------------------------------------------------------------------------
HBITMAP hbit;
CRect rect(0,0,400,566);
CDC* dc = GetDC();
CDC memdc;
memdc.CreateCompatibleDC( dc );
CBitmap bmp;
bmp.CreateCompatibleBitmap( dc, 400, 566);
::GetObject( &memdc, sizeof(hbit), &hbit);
memdc.SelectObject( &bmp );
CBrush brush;
brush.CreateSolidBrush(RGB(255,255,255));
memdc.SelectObject(&brush);
memdc.FillRect(CRect(0,0,400,566),&brush);
memdc.Ellipse(0,0,400,566);
memdc.SetTextColor( 0xFF );
memdc.MoveTo( 0 ,0);
memdc.LineTo(100,100);
memdc.TextOut(50,50, "我要红色的字体");
dc->BitBlt(0,0,400,566, &memdc, 0, 0, SRCCOPY);
SaveBmp( bmp, "c:\MEMDC.bmp");
-----------------------------------
//VC下把HBITMAP保存为bmp图片
BOOL SaveBmp(HBITMAP hBitmap, CString FileName)
{
HDC hDC;
//当前分辨率下每象素所占字节数
int iBits;
//位图中每象素所占字节数
WORD wBitCount;
//定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;
//位图属性结构
BITMAP Bitmap;
//位图文件头结构
BITMAPFILEHEADER bmfHdr;
//位图信息头结构
BITMAPINFOHEADER bi;
//指向位图信息头结构
LPBITMAPINFOHEADER lpbi;
//定义文件,分配内存句柄,调色板句柄
HANDLE fh, hDib, hPal,hOldPal=NULL;
//计算位图文件每个像素所占字节数
hDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
DeleteDC(hDC);
if(iBits <= 1)
wBitCount = 1;
else if(iBits <= 4)
wBitCount = 4;
else if(iBits <= 8)
wBitCount = 8;
else
wBitCount = 24;
GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
bi.biSize= sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression= BI_RGB;
bi.biSizeImage=0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrImportant = 0;
bi.biClrUsed = 0;
dwBmBitsSize = ((Bitmap.bmWidth *wBitCount+31) / 32)*4* Bitmap.bmHeight;
//为位图内容分配内存
hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi;
// 处理调色板
hPal = GetStockObject(DEFAULT_PALETTE);
if (hPal)
{
hDC = ::GetDC(NULL);
hOldPal = ::SelectPalette(hDC,(HPALETTE)hPal, FALSE);
RealizePalette(hDC);
}
// 获取该调色板下新的像素值
GetDIBits(hDC,hBitmap, 0,(UINT)Bitmap.bmHeight,
(LPSTR)lpbi+ sizeof(BITMAPINFOHEADER)+dwPaletteSize,
(BITMAPINFO *)lpbi, DIB_RGB_COLORS);
//恢复调色板
if (hOldPal)
{
::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
RealizePalette(hDC);
::ReleaseDC(NULL, hDC);
}
//创建位图文件
fh = CreateFile(FileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (fh == INVALID_HANDLE_VALUE) return FALSE;
// 设置位图文件头
bmfHdr.bfType = 0x4D42; // "BM"
dwDIBSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize;
bmfHdr.bfSize = dwDIBSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwPaletteSize;
// 写入位图文件头
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
// 写入位图文件其余内容
WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
//清除
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);
//保存成JPG
//SaveJpg(FileName);
return TRUE;
}
--------------------------------------------------
高人写的出处给人添上
/************************************************************
* 增加:
* //保存成Jpeg文件, quality(1..100)为图像质量
* HRESULT CImage::SaveJpeg( LPCTSTR pszFileName,int quality)
*
* Evlon
* http:evlon.cnblogs.com
* 273352165
*
*************************************************************/
inline HRESULT CImage::SaveJpeg( LPCTSTR pszFileName,int quality) const throw()
{
LONG paramValue = quality;
Gdiplus::EncoderParameter ep;
ep.Guid = Gdiplus::EncoderQuality;
ep.NumberOfValues = 1;
ep.Type = 4;//Gdiplus::EncoderParameterValueType::EncoderParameterValueTypeLong;
ep.Value = ¶mValue;
Gdiplus::EncoderParameters eps;
eps.Count = 1;
eps.Parameter[0] = ep;
return Save(pszFileName,Gdiplus::ImageFormatJPEG,&eps);
}
最后
以上就是怡然咖啡豆为你收集整理的VC++显示图片:的全部内容,希望文章能够帮你解决VC++显示图片:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复