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)上说创建的空位图导致的就是单色的结果 

   /**/ 

  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 上说过了,只是我一直看不出端倪
 最后摸索出跟人家一样的结果,唉,,惭愧啊

---------------------------------------------------------------------------


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)

*************************************************************/ 



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

 }