亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 基于vc.net的gdi+編程之cimage .txt

?? vc學習記錄
?? TXT
字號:
我們知道,Visual C++的CBitmap類和靜態圖片控件的功能是比較弱的,它只能顯示出在資源中的圖標、位圖、光標以及圖元文件的內容,而不像VB中的Image控件可以顯示出絕大多數的外部圖像文件(BMP、GIF、JPEG等)。因此,想要在對話框或其他窗口中顯示外部圖像文件則只能借助于第三方提供的控件或代碼。現在,MFC和ATL共享的新類CImage為圖像處理提供了許多相應的方法,這使得Visual C++在圖像方面的缺憾一去不復返了。
  CImage類概述

  CImage是MFC和ATL共享的新類,它能從外部磁盤中調入一個JPEG、GIF、BMP和PNG格式的圖像文件加以顯示,而且這些文件格式可以相互轉換。由于CImage在不同的Windows操作系統中其某些性能是不一樣的,因此在使用時要特別注意。例如,CImage::PlgBlt和CImage::MaskBlt只能在 Windows NT 4.0 或更高版本中使用,但不能運行在Windows 95/98 應用程序中。CImage::AlphaBlend和CImage::TransparentBlt也只能在 Windows 2000/98或其更高版本中使用。即使在Windows 2000運行程序還必須將stdafx.h文件中的WINVER和_WIN32_WINNT的預定義修改成0x0500才能正常使用。

  CImage封裝了DIB(設備無關位圖)的功能,因而可以讓我們能夠處理每個位圖像素。它具有下列最酷特性:

  1、AlphaBlend支持像素級的顏色混合,從而實現透明和半透明的效果。

  2、PlgBlt能使一個矩形區域的位圖映射到一個平行四邊形區域中,而且還可能使用位屏蔽操作。

  3、TransparentBlt在目標區域中產生透明圖像,SetTransparentColor用來設置某種顏色是透明色。

  4、MaskBlt在目標區域中產生源位圖與屏蔽位圖合成的效果。



  使用CImage的一般方法

  使用CImage的一般方法是這樣的過程:

  (1) 打開應用程序的stdafx.h文件添加CImage類的包含文件:

#include <atlimage.h>

  (2) 定義一個CImage類對象,然后調用CImage::Load方法裝載一個外部圖像文件。

  (3) 調用CImage::Draw方法繪制圖像。Draw方法具有如下定義:

BOOL Draw( HDC hDestDC, int xDest, int yDest,
int nDestWidth, int nDestHeight, int xSrc, int ySrc,
int nSrcWidth, int nSrcHeight );
BOOL Draw( HDC hDestDC, const RECT& rectDest, const RECT& rectSrc );
BOOL Draw( HDC hDestDC, int xDest, int yDest );
BOOL Draw( HDC hDestDC, const POINT& pointDest );
BOOL Draw( HDC hDestDC, int xDest, int yDest,
int nDestWidth, int nDestHeight );
BOOL Draw( HDC hDestDC, const RECT& rectDest ); 

  其中,hDestDC用來指定繪制的目標設備環境句柄,(xDest, yDest)和pointDest用來指定圖像顯示的位置,這個位置和源圖像的左上角點相對應。nDestWidth和nDestHeight分別指定圖像要顯示的高度和寬度,xSrc、ySrc、nSrcWidth和nSrcHeight用來指定要顯示的源圖像的某個部分所在的位置和大小。rectDest和rectSrc分別用來指定目標設備環境上和源圖像所要顯示的某個部分的位置和大小。

  需要說明的是,Draw方法綜合了StretchBlt、TransparentBlt和AlphaBlend函數的功能。默認時,Draw的功能和StretchBlt相同。但當圖像含有透明色或Alpha通道時,它的功能又和TransparentBlt、AlphaBlend相同。因此,在一般情況下,我們都應該盡量調用CImage::Draw方法來繪制圖像。

  例如,下面的示例Ex_Image是實現這樣的功能:當選擇"文件"ò"打開"菜單命令后,彈出一個文件打開對話框。當選定一個圖像文件后,就會在窗口客戶區中顯示該圖像文件內容。這個示例的具體步驟如下:

  (1) 創建一個默認的單文檔程序項目Ex_Image。

  (2) 打開stdafx.h文件中添加CImage類的包含文件atlimage.h。

  (3) 在CEx_ImageView類添加ID_FILE_OPEN的COMMAND事件映射程序,并添加下列代碼:

void CEx_ImageView::OnFileOpen()
{
 CString strFilter;
 CSimpleArray<GUID> aguidFileTypes;
 HRESULT hResult;

 // 獲取CImage支持的圖像文件的過濾字符串
 hResult = m_Image.GetExporterFilterString(strFilter,aguidFileTypes,
_T( "All Image Files") );
 if (FAILED(hResult)) {
  MessageBox("GetExporterFilter調用失?。?quot;);
  return;
 }
 CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST, strFilter);
 if(IDOK != dlg.DoModal()) 
  return;

 m_Image.Destroy();
 // 將外部圖像文件裝載到CImage對象中
 hResult = m_Image.Load(dlg.GetFileName());
 if (FAILED(hResult)) {
  MessageBox("調用圖像文件失??!");
  return;
 }

 // 設置主窗口標題欄內容
 CString str;
 str.LoadString(AFX_IDS_APP_TITLE);
 AfxGetMainWnd()->SetWindowText(str + " - " +dlg.GetFileName());

 Invalidate(); // 強制調用OnDraw
} 

  (4) 定位到CEx_ImageView::OnDraw函數處,添加下列代碼:

void CEx_ImageView::OnDraw(CDC* pDC)
{
 CEx_ImageDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 if (!m_Image.IsNull()) {
  m_Image.Draw(pDC->m_hDC,0,0);
 }
} 

  (5) 打開Ex_ImageView.h文件,添加一個公共的成員數據m_Image:

public:
CImage m_Image; 

  (6) 編譯并運行。單擊"打開"工具按鈕,在彈出的對話框中指定一個圖像文件后,單擊"打開"按鈕,其結果如圖7.21所示。




  將圖片用其它格式保存

  CImage::Save方法能將一個圖像文件按另一種格式來保存,它的原型如下:

HRESULT Save( LPCTSTR pszFileName, REFGUID guidFileType= GUID_NULL); 

  其中,pszFileName用來指定一個文件名,guidFileType用來指定要保存的圖像文件格式,當為GUID_NULL時,其文件格式由文件的擴展名來決定,這也是該函數的默認值。它還可以是GUID_BMPFile(BMP文件格式)、GUID_PNGFile(PNG文件格式)、GUID_JPEGFile(JPEG文件格式)和GUID_GIFFile(GIF文件格式)。

  例如,下面的過程是在Ex_Image示例基礎上進行的,我們在CEx_ImageView類添加ID_FILE_SAVE_AS的COMMAND事件映射程序,并添加下列代碼:

void CEx_ImageView::OnFileSaveAs()
{
 if (m_Image.IsNull()) {
  MessageBox("你還沒有打開一個要保存的圖像文件!");
  return;
 }

 CString strFilter;
 strFilter = "位圖文件|*.bmp|JPEG 圖像文件|*.jpg| \
GIF 圖像文件|*.gif|PNG 圖像文件|*.png||";
 CFileDialog dlg(FALSE,NULL,NULL,NULL,strFilter);
 if ( IDOK != dlg.DoModal()) 
  return;

 // 如果用戶沒有指定文件擴展名,則為其添加一個
 CString strFileName;
 CString strExtension;

 strFileName = dlg.m_ofn.lpstrFile;
 if (dlg.m_ofn.nFileExtension == 0) 
 {
  switch (dlg.m_ofn.nFilterIndex)
  {
   case 1:
    strExtension = "bmp"; break;
   case 2:
    strExtension = "jpg"; break;
   case 3:
    strExtension = "gif"; break;
   case 4:
    strExtension = "png"; break;
   default:
    break;
  }
  strFileName = strFileName + '.' + strExtension;
 }

 // 圖像保存
 HRESULT hResult = m_Image.Save(strFileName);
 if (FAILED(hResult)) 
  MessageBox("保存圖像文件失?。?quot;);
} 


  柔化和銳化處理

  在圖像處理中,我們通常用一些數學手段,對圖像進行除去噪聲、強調或抽取輪廓特征等圖像空間的變換。所謂"圖像空間的變換"是借助于一個稱之為模板的局部像素域來完成的,不同的模板具有不同的圖像效果。

  1. 柔化

  圖像的柔化是除去圖像中點狀噪聲的一個有效方法。所謂柔化,是指使圖像上任何一個像素與其相鄰像素的顏色值的大小不會出現陡突的一種處理方法。設在一個3 x 3的模板中其系數為:



  中間有底紋的表示中心元素,即用那個元素作為處理后的元素。很明顯,上述模板(稱之為Box模板)是將圖像上每個像素用它近旁(包括它本身)的9個像素的平均值取代。這樣處理的結果在除噪的同時,也降低圖像的對比度,使圖像的輪廓模糊。為了避免這一缺陷,我們對各點引入加權系數,將原來的模板改為:



  新的模板可一方面除去點狀噪聲,同時能較好地保留原圖像的對比度,因此該模板得到了廣泛的應用。由于這個模板是通過二維高斯(Gauss)函數得到的,故稱為高斯模板。

  2. 銳化

  銳化和柔化恰恰相反,它通過增強高頻分量減少圖像中的模糊,因此又稱為高通濾波。銳化處理在增強圖像邊緣效果的同時增加了圖像的噪聲。常用的銳化模板是拉普拉斯模板:



  用此模板處理后的圖像,輪廓線條將明顯得到增強。輪廓線以外的部分將變得較暗,而輪廓線部分將變得比較明亮。

  使用程序對模板進行運算時,要考慮到溢出點的處理。所謂溢出點,指的是大于255或小于0的點。處理時,可令大于255的點取255,而小于0的點取其正值。

  3. 實現代碼

  實現柔化和銳化時,我們先調用CImage::GetPixel來依次讀取相應的像素,然后用柔化和銳化模板進行處理,最后調用CImage::SetPixel函數將處理后的像素寫回到CImage對象中。具體的代碼如下:

void FilterImage(CImage* image, int nType)
{
 if (image->IsNull())
  return;
 int smoothGauss[9] = {1,2,1,2,4,2,1,2,1}; // 高斯模板
 int sharpLaplacian[9] = {-1,-1,-1,-1,9,-1,-1,-1,-1}; // 拉普拉斯模板

 int opTemp[9];
 float aver; // 系數
 if ( nType > 1) nType = 0;
 switch( nType ){
  case 0: // 高斯模板
   aver = (float)(1.0/16.0);
   memcpy( opTemp, smoothGauss, 9*sizeof(int));
   break;
  case 1: // 拉普拉斯模板
   aver = 1.0;
   memcpy( opTemp, sharpLaplacian, 9*sizeof(int));
   break;
 }

 int i,j;

 int nWidth = image->GetWidth();
 int nHeight = image->GetHeight();

 for (i = 1; i < nWidth-1; i++){
  for (j = 1; j < nHeight-1; j++){

   int rr = 0, gg = 0, bb = 0;
   int index = 0;

   for (int col = -1; col <= 1; col++){
    for (int row = -1; row <= 1; row++){
     COLORREF clr = image->GetPixel( i+row, j+col);
     rr += GetRValue(clr) * opTemp[index];
     gg += GetGValue(clr) * opTemp[index];
     bb += GetBValue(clr) * opTemp[index];
     index++;
    }
   }
  
   rr = (int)(rr*aver);
   gg = (int)(gg*aver);
   bb = (int)(bb*aver);

   // 處理溢出點
  if ( rr > 255 ) rr = 255;
  else if ( rr < 0 ) rr = -rr;
  if ( gg > 255 ) gg = 255;
  else if ( gg < 0 ) gg = -gg;
  if ( bb > 255 ) bb = 255;
  else if ( bb < 0 ) bb = -bb;

  // 錯位重寫以避免前一個像素被新的像素覆蓋
  image->SetPixel( i-1, j-1, RGB(rr,gg,bb));
  }
 }
} 

圖7.22是使用上述代碼將某個圖像處理后的結果。





  變成黑白圖片

  由于許多圖像文件使用顏色表來發揮顯示設備的色彩顯示能力,因而將一張彩色圖片變成黑色圖片時需要調用CImage::IsIndexed來判斷是否使用顏色表,若是則修改顏色表,否則直接將像素進行顏色設置。例如下面的代碼:

void CEx_ImageView::MakeBlackAndwhite(CImage* image)
{
 if (image->IsNull()) return;

 if (!image->IsIndexed()) {
  // 直接修改像素顏色
  COLORREF pixel;
  int maxY = image->GetHeight(), maxX = image->GetWidth();
  byte r,g,b,avg;
  for (int x=0; x<maxX; x++) {
   for (int y=0; y<maxY; y++) {
    pixel = image->GetPixel(x,y);
    r = GetRValue(pixel);
    g = GetGValue(pixel);
    b = GetBValue(pixel);
    avg = (int)((r + g + b)/3);
    image->SetPixelRGB(x,y,avg,avg,avg);
   }
  }
 } else {
  // 獲取并修改顏色表
  int MaxColors = image->GetMaxColorTableEntries();
  RGBQUAD* ColorTable;
  ColorTable = new RGBQUAD[MaxColors];
  image->GetColorTable(0,MaxColors,ColorTable);
  for (int i=0; i<MaxColors; i++)
  {
   int avg = (ColorTable[i].rgbBlue + ColorTable[i].rgbGreen + ColorTable[i].rgbRed)/3;
   ColorTable[i].rgbBlue = avg;
   ColorTable[i].rgbGreen = avg;
   ColorTable[i].rgbRed = avg;
  }
  image->SetColorTable(0,MaxColors,ColorTable);
  delete(ColorTable);
 }
} 

  至此,我們介紹了GDI+和CImage的一般使用方法和技巧。當然,它們本身還有許多更深入的方法,由于篇幅所限,這里不再一一討論。

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品99久久不卡二区| 精品久久一区二区三区| 欧美日韩精品一区二区在线播放| 91精品国产色综合久久ai换脸 | hitomi一区二区三区精品| 色嗨嗨av一区二区三区| 精品国产一区二区精华| 亚洲欧美另类小说视频| 麻豆精品一区二区三区| 91精品1区2区| 欧美国产日韩在线观看| 日本成人在线电影网| 91麻豆国产在线观看| 久久影院电视剧免费观看| 亚洲bdsm女犯bdsm网站| 99re这里只有精品首页| 亚洲精品在线观| 日韩1区2区日韩1区2区| 色综合久久88色综合天天| 久久伊人蜜桃av一区二区| 日韩精品乱码av一区二区| 91麻豆产精品久久久久久| 久久精品水蜜桃av综合天堂| 午夜精品久久久久久久99水蜜桃 | 日韩精品一级二级 | 欧美午夜电影在线播放| 国产目拍亚洲精品99久久精品| 亚洲成人午夜电影| 一本在线高清不卡dvd| 国产日韩欧美亚洲| 韩国女主播一区| 日韩欧美视频一区| 日韩av一区二区三区四区| 欧美综合欧美视频| 自拍偷拍亚洲激情| 99热99精品| 中文字幕亚洲一区二区av在线| 国产精品自在在线| 精品国产电影一区二区| 久久超碰97中文字幕| 91精品国产手机| 欧美aaa在线| 日韩欧美一区二区视频| 久久99精品国产麻豆婷婷| 精品少妇一区二区三区日产乱码 | 成人18视频日本| 国产无遮挡一区二区三区毛片日本| 久久精品二区亚洲w码| 日韩女优制服丝袜电影| 国产一区激情在线| 久久精品视频网| 懂色av中文字幕一区二区三区| 国产亚洲精品免费| 99国产精品一区| 亚洲精品菠萝久久久久久久| 色先锋资源久久综合| 一区二区三区精密机械公司| 91视视频在线直接观看在线看网页在线看 | 中文字幕 久热精品 视频在线 | 一区二区三区在线视频观看58| 99re热视频精品| 亚洲一区二区三区三| 91麻豆精品国产91久久久久久久久 | 欧美一区二区不卡视频| 日本麻豆一区二区三区视频| 精品国产一区二区在线观看| 国产91丝袜在线播放0| 自拍偷拍欧美精品| 在线成人午夜影院| 国产原创一区二区| 亚洲欧美日韩中文播放| 欧美区视频在线观看| 国产美女娇喘av呻吟久久| 亚洲美女视频在线| 欧美一卡2卡三卡4卡5免费| 精品亚洲porn| 中文字幕在线观看一区二区| 欧美日韩国产a| 国产一区二区免费视频| 亚洲视频中文字幕| 欧美一区二区三区在线观看| 国产成人精品aa毛片| 亚洲最大的成人av| 26uuu亚洲| 欧美伊人久久久久久午夜久久久久| 麻豆精品视频在线观看免费| 中国av一区二区三区| 制服视频三区第一页精品| 国产91精品入口| 天天爽夜夜爽夜夜爽精品视频| 久久中文娱乐网| 欧美色大人视频| 成人综合在线视频| 看国产成人h片视频| 亚洲欧洲av在线| 久久青草国产手机看片福利盒子 | 久久久噜噜噜久久中文字幕色伊伊| 亚洲一区二区在线视频| 波多野洁衣一区| 亚洲午夜久久久久| 久久精品免视看| 538在线一区二区精品国产| 大胆欧美人体老妇| 久草中文综合在线| 亚洲人成精品久久久久久| 2021中文字幕一区亚洲| 亚洲裸体xxx| 亚洲日本护士毛茸茸| 国产中文字幕一区| 欧美高清视频www夜色资源网| 日本一二三不卡| 久久91精品久久久久久秒播| 在线亚洲一区观看| 国产精品国产精品国产专区不片| 日韩中文字幕av电影| 色综合久久久久久久久久久| 欧美精品一区二区三| 视频一区二区中文字幕| 色婷婷av一区| 亚洲三级理论片| 不卡一区中文字幕| 国产片一区二区三区| 另类小说一区二区三区| 日韩视频一区二区| 天堂成人国产精品一区| 欧美日韩国产小视频| 一区二区激情视频| 91国偷自产一区二区三区成为亚洲经典 | 精品一区二区三区在线视频| 欧美日韩五月天| 亚洲小少妇裸体bbw| 在线观看av不卡| 亚洲伊人色欲综合网| 成人免费视频一区二区| 国产精品区一区二区三区| 国产福利一区在线| 久久久亚洲午夜电影| 国产精品77777竹菊影视小说| 久久综合九色综合97_久久久| 久久电影网站中文字幕| 欧美大度的电影原声| 久久99国内精品| 国产日韩欧美高清在线| 成人久久18免费网站麻豆| 亚洲欧洲性图库| 色噜噜狠狠一区二区三区果冻| 一区二区视频在线看| 欧美日本视频在线| 麻豆freexxxx性91精品| 久久午夜羞羞影院免费观看| 国产精品一区二区三区乱码| 欧美高清一级片在线观看| 91在线无精精品入口| 天天影视色香欲综合网老头| 精品国产髙清在线看国产毛片| 丰满放荡岳乱妇91ww| 自拍偷拍国产亚洲| 欧美一级日韩不卡播放免费| 国产精品911| 亚洲一二三四久久| 日韩精品一区二区三区视频播放| 国产91精品露脸国语对白| 亚洲精品中文字幕在线观看| 91精品国产乱码| 懂色av一区二区三区免费看| 中文字幕综合网| 日韩女优制服丝袜电影| 99久久免费国产| 蜜臀av国产精品久久久久| 国产精品污网站| 日韩三级视频中文字幕| 色婷婷精品大在线视频 | 中文字幕精品一区二区三区精品 | 五月天久久比比资源色| 久久精品视频一区二区三区| 欧美在线啊v一区| 粉嫩aⅴ一区二区三区四区| 天天亚洲美女在线视频| 中文字幕一区二| 欧美成人官网二区| 欧美视频一二三区| 99久久精品免费看| 国产九色精品成人porny| 亚洲成人你懂的| 日韩毛片视频在线看| 亚洲精品一线二线三线无人区| 色婷婷久久久综合中文字幕 | 五月天视频一区| 中文字幕在线免费不卡| 2014亚洲片线观看视频免费| 欧美日韩国产一二三| 99国产一区二区三精品乱码| 黑人精品欧美一区二区蜜桃| 日本伊人色综合网| 亚洲一区二区三区自拍| 亚洲日本va在线观看| 亚洲视频一区在线| 最新高清无码专区| 国产精品久久久久aaaa| 国产农村妇女毛片精品久久麻豆|