VC++显示图片:

来源:互联网 发布:java message service 编辑:程序博客网 时间:2024/05/17 03:36
 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 = &paramValue;


    Gdiplus::EncoderParameters eps;
    eps.Count = 1;
    eps.Parameter[0] = ep;
    return Save(pszFileName,Gdiplus::ImageFormatJPEG,&eps);
}






 




 














 
0 0
原创粉丝点击