Cimage類處理圖像像素(數據)的3種方式(轉)


這里只討論對圖像像素的處理,cimage類的具體用法查相關資料
#include <atlimage.h>   //VS2010以后不用加這個
 ……………………
CImage  m_Image;     //或CImage*  m_Image;  下面例子程序我用的CImage  m_Image; 只是一個用成員選擇符,一個用指針操作,效率上可能有所差異

下面是3種方法:

一、用Cimage類的成員函數進行處理

這里假設你已經加載了圖像位圖,並與CImage對象m_Image相關聯。相關成員函數主要有:     

 GetPixel 返回像素顏色                        

SetPixel 設置像素顏色

 如:m_Image.SetPixel(  i-1,  j-1,  RGB(rr,gg,bb));

SetPixelRGB 設置像素的紅綠藍

如:m_Image.SetPixelRGB(x,y,avg,avg,avg); 

SetColorTable 設置調色板顏色分量(紅、綠、藍)值

 

GetWidth 寬度(以像素為單位)                      

GetHeight 高度

1、程序示例

1)一個雙線性插值放大程序。

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. if  (m_Image.IsNull())    
  2.      return;   
  3.     // 創建對話框  
  4.     DlgInterpolation TranPara;    
  5.     //顯示對話框,提示用戶設定量  
  6.     if (TranPara.DoModal() != IDOK)  
  7.         return;   
  8.     int k=TranPara.m_inter;  
  9.     BeginWaitCursor();  
  10.     CImage  m_Image1;  
  11.     if (! m_Image1.IsNull())   
  12.     {     
  13.          m_Image1.Destroy();   
  14.     }  
  15.     m_Image1.Create( m_Image.GetWidth()*k, m_Image.GetHeight()*k, 24,0);  
  16.     // 四個最臨近象素的坐標  
  17.     int x1, x2;  
  18.     int y1, y2;  
  19.     // 四個最臨近象素值  
  20.     unsigned char   f1, f2, f3, f4;  
  21.     // 二個插值中間值  
  22.     unsigned char   f12, f34;  
  23.     //計算結果  
  24.     int fr,fb,fg;  
  25.     double  epsilon = 0.001;      
  26.     COLORREF pixel11,pixel12,pixel21,pixel22;  
  27.     int nHeight1 = m_Image1.GetHeight();  
  28.     int nWidth1 = m_Image1.GetWidth();  
  29.     int nHeight = m_Image.GetHeight();  
  30.     int nWidth = m_Image.GetWidth();  
  31.     double m=((double)nWidth1-1)/((double)nWidth-1);  
  32.     for  (int  i=0;  i<nWidth1;  i++)   
  33.     {   
  34.             for  (int  j=0;  j<nHeight1;  j++)   
  35.             {   
  36.                 double x=double((double)i/m);  
  37.             double y=double((double)j/m);  
  38.             //計算四個最臨近象素的坐標,+1向右下方移動  
  39.             x1 = (int) x;  
  40.             x2 = x1 + 1;  
  41.             y1 = (int) y;  
  42.             y2 = y1 + 1;      
  43.             if( (x < 0) || (x > nWidth - 1) || (y < 0) || (y > nHeight - 1))  
  44.             {  
  45.             //要計算的點不在源圖范圍內,返回-1  
  46.             continue;  
  47.             }  
  48.             else  
  49.             {  
  50.             if (fabs(x - nWidth + 1) <= epsilon )  
  51.             {  
  52.               // 要計算的點在圖像右邊緣上  
  53.               if (fabs(y -nHeight + 1) <= epsilon)  
  54.               {  
  55.                 // 要計算的點正好是圖像最右下角那一個象素,直接返回該點象素值  
  56.                 pixel11 = m_Image.GetPixel(x1,y1);   
  57.                     f1 = (unsigned char)GetRValue(pixel11);  
  58.                     fr=(int)f1;  
  59.                 f1 = (unsigned char)GetGValue(pixel11);  
  60.                 fg=(int)f1;  
  61.                 f1 = (unsigned char)GetBValue(pixel11);  
  62.                 fb=(int)f1;  
  63.                }  
  64.                else  
  65.                {  
  66.                 // 在圖像右邊緣上且不是最后一點,直接一次插值即可  
  67.                 pixel11 = m_Image.GetPixel(x1,y1);  
  68.                 pixel12 = m_Image.GetPixel(x1,y2);   
  69.                 f1 = (unsigned char)GetRValue(pixel11);   
  70.                 f3 = (unsigned char)GetRValue(pixel12);               
  71.                 fr= (int) (f1 + (y -y1) * (f3 - f1));  
  72.                 f1 = (unsigned char)GetGValue(pixel11);   
  73.                 f3 = (unsigned char)GetGValue(pixel12);               
  74.                 fg= (int) (f1 + (y -y1) * (f3 - f1));  
  75.                 f1 = (unsigned char)GetBValue(pixel11);   
  76.                 f3 = (unsigned char)GetBValue(pixel12);               
  77.                 fb= (int) (f1 + (y -y1) * (f3 - f1));  
  78.                }  
  79.              }  
  80.              else if (fabs(y - nHeight + 1) <= epsilon)  
  81.              {  
  82.                       // 要計算的點在圖像下邊緣上且不是最后一點,直接一次插值即可  
  83.                pixel11 = m_Image.GetPixel(x1,y1);  
  84.                pixel21 = m_Image.GetPixel(x2,y1);   
  85.                f1 = (unsigned char)GetRValue(pixel11);   
  86.                f2 = (unsigned char)GetRValue(pixel21);   
  87.                fr=(int) (f1 + (x -x1) * (f2 - f1));  
  88.                f1 = (unsigned char)GetGValue(pixel11);   
  89.                f2 = (unsigned char)GetGValue(pixel21);   
  90.                fg=(int) (f1 + (x -x1) * (f2 - f1));  
  91.                f1 = (unsigned char)GetBValue(pixel11);   
  92.                f2 = (unsigned char)GetBValue(pixel21);   
  93.                fb=(int) (f1 + (x -x1) * (f2 - f1));  
  94.               }  
  95.               else  
  96.               {  
  97.                pixel11 = m_Image.GetPixel(x1,y1);   
  98.                        pixel12 = m_Image.GetPixel(x1,y2);     
  99.                        pixel21 = m_Image.GetPixel(x2,y1);     
  100.                        pixel22 = m_Image.GetPixel(x2,y2);   
  101.                // 計算四個最臨近象素值  
  102.                f1 = (unsigned char)GetRValue(pixel11);   
  103.                f2 = (unsigned char)GetRValue(pixel21);   
  104.                    f3 = (unsigned char)GetRValue(pixel12);   
  105.                    f4 = (unsigned char)GetRValue(pixel22);   
  106.                f12 = (unsigned char) (f1 + (x - x1) * (f2 - f1));  
  107.                f34 = (unsigned char) (f3 + (x - x1) * (f4 - f3));  
  108.                fr= (int) (f12 + (y -y1) * (f34 - f12));  
  109.                f1 = (unsigned char)GetGValue(pixel11);   
  110.                f2 = (unsigned char)GetGValue(pixel21);   
  111.                f3 = (unsigned char)GetGValue(pixel12);   
  112.                f4 = (unsigned char)GetGValue(pixel22);   
  113.                f12 = (unsigned char) (f1 + (x - x1) * (f2 - f1));  
  114.                f34 = (unsigned char) (f3 + (x - x1) * (f4 - f3));  
  115.                fg= (int) (f12 + (y -y1) * (f34 - f12));  
  116.                f1 = (unsigned char)GetBValue(pixel11);   
  117.                f2 = (unsigned char)GetBValue(pixel21);   
  118.                f3 = (unsigned char)GetBValue(pixel12);   
  119.                f4 = (unsigned char)GetBValue(pixel22);   
  120.                f12 = (unsigned char) (f1 + (x - x1) * (f2 - f1));  
  121.                f34 = (unsigned char) (f3 + (x - x1) * (f4 - f3));  
  122.                fb= (int) (f12 + (y -y1) * (f34 - f12));  
  123.               }  
  124.             }  
  125.                 m_Image1.SetPixel(i,j,  RGB(fr,fg,fb));           
  126.        }  
  127.      }  
  128.      m_Image.Destroy();  
  129.      m_Image.Create( m_Image1.GetWidth(), m_Image1.GetHeight(), 24, 0);  
  130.      COLORREF pixel;  
  131.      for  (int  i=0;  i<nWidth1;  i++)   
  132.      {   
  133.           for  (int  j=0;  j<nHeight1;  j++)   
  134.           {   
  135.            pixel = m_Image1.GetPixel(i,j);   
  136.            int y=GetRValue(pixel);  
  137.            int p=GetGValue(pixel);  
  138.            int b=GetBValue(pixel);  
  139.                m_Image.SetPixelRGB(i,j,GetRValue(pixel),GetGValue(pixel),GetBValue(pixel));   
  140.       }  
  141.      }  
  142.     m_Image1.Destroy();  
  143.     Invalidate();  
  144.     EndWaitCursor();  

2)處理視頻幀

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. ……  
  2. Defog(imageprosses, nimgWidth, nimgheigt);/*我加的一個霧天圖像增強的動態庫,imageprosses是視頻的一幀,輸入imageprosses處理,並輸出imageprosses*/  
  3. int  rr  =  0,  gg  =  0,  bb  =  0;   
  4. for  (int i  =  0;  i  < nimgWidth;  i++)  
  5. {   
  6.     for  (int j  =  1;  j  <= nimgheigt;  j++)  
  7.     {   
  8.          bb=(int)imageprosses[3*i*j];  
  9.          gg=(int)imageprosses[3*i*j+1];  
  10.          rr=(int)imageprosses[3*i*j+2];  
  11.          m_Image.SetPixel(i,  j-1,  RGB(rr,gg,bb));/*設置一幀圖像的像素值用來顯示*/                 
  12.     }  
  13. }  
  14. ……  

 

2、比較:非常慢。一個圖像數據一般很大的,函數調用、參數傳遞會更加耗時。

二、直接對內存進行操作

相關成員函數:

GetPitch 行距

GetBPP 每像素位數,用時記得GetBPP()/8

GetBits 返回圖像像素數據指針

1、程序示例

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. ……  
  2. Defog(imageprosses, nimgWidth, nimgheigt);  
  3. //調用cimage類  
  4. if  (m_Image.IsNull())   
  5.     m_Image.Create( nimgWidth, nimgheigt, 24,0);  
  6.     //地址訪問方式  
  7. byte* pRealData;  
  8. //首地址    
  9. pRealData=(byte*)m_Image.GetBits();  
  10. //行距  
  11. int pit=m_Image.GetPitch();  
  12. for  (int i  =  0;  i  <nimgWidth;  i++)  
  13. {   
  14.     for  (int j  =  0;  j  < nimgheigt;  j++)  
  15.     {   
  16.     *(pRealData + pit*j+ i*3)=(int)imageprosses[3*(nimgheigt-1-j)*nimgWidth+3*i];      
  17.     *(pRealData + pit*j +i*3 +1)=(int)imageprosses[3*(nimgheigt-1-j)*nimgWidth+3*i+1];    
  18.     *(pRealData + pit*j + i*3 +2)=(int)imageprosses[3*(nimgheigt-1-j)*nimgWidth+3*i+2];   
  19.     }  
  20. }  
  21. m_Image.Draw(pDC->m_hDC,0,0,nWidth,nheigt);    
  22. ……  

2、比較: 對地址直接操作最快,不需要多余的轉換。

三、用數組進行處理

       如果處理比較復雜的話,可把所有點顏色全部讀到一個二維數組里面,然后對這個數組進行讀寫和處理。 再把處理后的圖像顯示出來。最方便的是可以進行一些自己需要的預處理,比如我是這樣做的。

      首先定義一個相關頭文件和源文件處理相關內存操作

//MYIMAGE.h

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. #if !defined(MyIMAGE)  
  2. #define MyIMAGE  
  3. #if _MSC_VER > 1000  
  4. #pragma once  
  5. #endif // _MSC_VER > 1000  
  6. #include "windows.h"  
  7.   
  8. // 灰度圖  
  9. typedef byte **MYIMAGE;/*二維數組的數組名就是一個指向指針的指針,a的作用相當於**a,而a->[0],相當於a[0][0]*/  
  10. //彩色圖  
  11. typedef struct MYCOLORIMAGESTRUCT  
  12. {   
  13.      MYIMAGE r, g, b;   
  14. }MYCOLORIMAGE;  
  15.   
  16. ////// 8bit圖像操作  
  17. // 8bit圖像分配  
  18. MYIMAGE MyImageAlloc(int height,int width);  
  19.   
  20. // 8bit圖像釋放  
  21. void MyImageFree(MYIMAGE a, int height);  
  22.   
  23. // 8bit圖像拷貝  
  24. bool MyImageCopy(MYIMAGE dest, MYIMAGE source, int width, int height);  
  25.   
  26. // 8bit圖像設置  
  27. void MyImageSet(MYIMAGE a, int value, int width, int height);  
  28.   
  29. ////// 24bit圖像操作  
  30. // 24bit圖像分配  
  31. MYCOLORIMAGE MyColorImageAlloc(int height,int width);  
  32.   
  33. // 24bit圖像釋放  
  34. void MyColorImageFree(MYCOLORIMAGE a, int height);  
  35.   
  36. // 24bit圖像拷貝  
  37. bool MyColorImageCopy(MYCOLORIMAGE dest, MYCOLORIMAGE source, int width, int height);  
  38.   
  39. // 24bit圖像設置  
  40. void MyColorImagSet(MYCOLORIMAGE a, int value, int width, int height);  
  41.   
  42. // 彩色圖像轉灰度圖象  
  43. bool MyColorToGray(MYIMAGE outGrayImg, MYCOLORIMAGE inColorImg, int width, int Height);  
  44.   
  45. #endif MyIMAGE  

 

//MYIMAGE.cpp

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. #include "StdAfx.h"  
  2. #include "MYIMAGE.h"  
  3. //灰度圖像  
  4. /**************my分配內存空間***************/  
  5. MYIMAGE MyImageAlloc(int height,int width)  
  6. {     
  7.     MYIMAGE a = (MYIMAGE) new MYIMAGE*[height];//數組指針  
  8.     int i;  
  9.     byte* pTemp;  
  10.     pTemp = new UCHAR[height*width];  
  11.       
  12.     for(i = 0; i < height; i++)  
  13.     {  
  14.         a[i] = pTemp + width * i;  
  15.     }  
  16.           
  17.     return a;  
  18. }  
  19. /*********釋放內存空間***************/  
  20. void MyImageFree(MYIMAGE a, int height)  
  21. {  
  22.     delete[] a[0];  
  23.     delete a;  
  24. }  
  25. /*******拷貝************/  
  26. bool MyImageCopy(MYIMAGE dest, MYIMAGE source, int width, int height)  
  27. {  
  28.     if(dest == NULL || source == NULL || width <= 0 || height <= 0)  
  29.         return false;  
  30.   
  31.     int i = 0;  
  32.     for(i = 0; i < height; i++)  
  33.     {  
  34.         memcpy(dest[i], source[i], sizeof(UCHAR) * width);  
  35.     }  
  36.       
  37.     return true;  
  38. }  
  39. /*******賦值*******/  
  40. void MyImageSet(MYIMAGE a, int value, int width, int height)  
  41. {  
  42.     int i;   
  43.     for(i = 0; i < height; i++)  
  44.     {  
  45.         memset(a[i], value, sizeof(UCHAR) * width);  
  46.     }  
  47. }  
  48. //彩色圖像  
  49. /**************my彩色圖像分配內存空間**********************/  
  50. MYCOLORIMAGE MyColorImageAlloc(int height,int width)  
  51. {  
  52.     //MYCOLORIMAGE a = (MYCOLORIMAGE) new char[sizeof(MYIMAGE) * 3];  
  53.     MYCOLORIMAGE a;  
  54.     a.r = MyImageAlloc(height,width);  
  55.     a.g = MyImageAlloc(height,width);  
  56.     a.b = MyImageAlloc(height,width);  
  57.   
  58.     return a;  
  59. }  
  60. /****************my彩色圖像空間內存釋放*********************/  
  61. void MyColorImageFree(MYCOLORIMAGE a, int height)  
  62. {  
  63.     /* 
  64.     MyImageFree(a->r, height); 
  65.     MyImageFree(a->g, height); 
  66.     MyImageFree(a->b, height); 
  67.     delete a; 
  68.     */  
  69.     MyImageFree(a.r, height);  
  70.     MyImageFree(a.g, height);  
  71.     MyImageFree(a.b, height);  
  72. }  
  73. /***************my彩色圖像拷貝******************/  
  74. bool MyColorImageCopy(MYCOLORIMAGE dest, MYCOLORIMAGE source, int width, int height)  
  75. {  
  76.     /* 
  77.     if(dest == NULL || source == NULL || width <= 0 || height <= 0) 
  78.     return false; 
  79.     int i = 0; 
  80.     for(i = 0; i < height; i++) 
  81.     { 
  82.         memcpy(dest->r[i], source->r[i], sizeof(UCHAR) * width); 
  83.         memcpy(dest->g[i], source->g[i], sizeof(UCHAR) * width); 
  84.         memcpy(dest->b[i], source->b[i], sizeof(UCHAR) * width); 
  85.     } 
  86.     return true; 
  87.     */  
  88.     if(dest.r == NULL || source.r == NULL || width <= 0 || height <= 0)  
  89.     return false;  
  90.     for(int i = 0; i < height; i++)  
  91.     {  
  92.         memcpy(dest.r[i], source.r[i], sizeof(UCHAR) * width);  
  93.         memcpy(dest.g[i], source.g[i], sizeof(UCHAR) * width);  
  94.         memcpy(dest.b[i], source.b[i], sizeof(UCHAR) * width);  
  95.     }  
  96.     return true;  
  97. }  
  98. /**********my彩色圖像賦值*****************/  
  99. void MyColorImagSet(MYCOLORIMAGE a, int value, int width, int height)  
  100. {  
  101.     int i;   
  102.     for(i = 0; i < height; i++)  
  103.     {  
  104.         memset(a.r[i], value, sizeof(UCHAR) * width);  
  105.         memset(a.g[i], value, sizeof(UCHAR) * width);  
  106.         memset(a.b[i], value, sizeof(UCHAR) * width);  
  107.     }  
  108. }  
  109. /**********my彩色圖轉為灰度圖**************/  
  110. bool MyColorToGray(MYIMAGE outGrayImg, MYCOLORIMAGE inColorImg, int width, int Height)  
  111. {  
  112.     if(outGrayImg == NULL || inColorImg.r == NULL || width <= 0 || Height <= 0)  
  113.         return false;  
  114.   
  115.     for(int j = 0; j < Height; j++)  
  116.     {  
  117.         for(int i = 0; i < width; i++)  
  118.         {  
  119.             outGrayImg[j][i] = (int)(0.3 * inColorImg.r[j][i] + 0.59 * inColorImg.g[j][i] + 0.11 * inColorImg.b[j][i]);  
  120.         }  
  121.     }  
  122.   
  123.     return TRUE;  
  124. }  

            然后一些預處理操作,如格式間轉換:

 //ImageTransform.h

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. #if !defined(ImageTransform)  
  2. #define ImageTransform  
  3.   
  4. #if _MSC_VER > 1000  
  5. #pragma once  
  6. #endif // _MSC_VER > 1000  
  7.   
  8. //#include "ximage.h"  
  9. #include "MYIMAGE.h"  
  10. #include "atlimage.h"   
  11. //CImage到MYIMAGE之間的格式轉換  
  12. //灰度  
  13. // CImage轉換成MYIMAGE  
  14. BOOL CxImageToMYIMAGE(MYIMAGE destpImgbuf, CImage&  sourpCxImage, int nImgWidth, int nImgHeight);  
  15. // MYIMAGE轉換成CImage  
  16. BOOL MYIMAGEToCxImage(CImage&  destpCxImage,  MYIMAGE sourpImgbuf, int nImgWidth, int nImgHeight);  
  17.   
  18. //彩色  
  19. // CImage轉換成MYCOLORIMAGE  
  20. BOOL CxxImageToMYIMAGE(MYCOLORIMAGE destpImgbuf, CImage&  sourpCxImage, int nImgWidth, int nImgHeight);  
  21. // MYCOLORIMAGE轉換成CImage  
  22. BOOL MYIMAGEToCxxImage(CImage&  destpCxImage,  MYCOLORIMAGE sourpImgbuf, int nImgWidth, int nImgHeight);  
  23.   
  24. #endif ImageTransform  

 

//ImageTransform.cpp

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. #include "StdAfx.h"  
  2. #include "ImageTransform.h"  
  3. //灰度  
  4. //  CImage轉換成MYIMAGE  
  5. BOOL CxImageToMYIMAGE(MYIMAGE destpImgbuf, CImage&  sourpCxImage, int nImgWidth, int nImgHeight)  
  6. {  
  7.     // 參數檢查  
  8.     if(destpImgbuf == NULL || sourpCxImage == NULL || nImgWidth <= 0 || nImgHeight <= 0)  
  9.     return FALSE;  
  10.     int i, j;  
  11.     COLORREF rgb;  
  12.     //8位灰度圖轉存為8位灰度圖  
  13.      if(sourpCxImage.GetBPP()/8 ==1)   
  14.     {  
  15.         for(j = 0; j < nImgHeight; j++)  
  16.         {  
  17.             for(i = 0; i < nImgWidth; i++)  
  18.             {      
  19.              destpImgbuf[j][i] = (byte)sourpCxImage.GetPixel(i, j);  
  20.             }  
  21.         }  
  22.   
  23.     }  
  24.     //24位灰度圖象轉換為8位灰度圖  
  25.     else if(sourpCxImage.GetBPP()/8==3)  
  26.     {  
  27.         for(j = 0; j < nImgHeight; j++)  
  28.         {  
  29.             for(i = 0; i < nImgWidth; i++)  
  30.             {  
  31.                 rgb = sourpCxImage.GetPixel(i, j);  
  32.                 destpImgbuf[j][i] = GetRValue(rgb);  
  33.             }  
  34.         }  
  35.     }  
  36.      return TRUE;  
  37. }  
  38. // MYIMAGE轉換成CImage  
  39. BOOL MYIMAGEToCxImage(CImage& destpCxImage, MYIMAGE sourpImgbuf, int nImgWidth, int nImgHeight)  
  40. {  
  41.     // 參數檢查  
  42.     if(destpCxImage == NULL || sourpImgbuf == NULL || nImgWidth <= 0 || nImgHeight <= 0)  
  43.     return FALSE;  
  44.     int i, j;  
  45.     //8位灰度圖轉換為24位灰度圖  
  46.     for(j = 0; j < nImgHeight; j++)  
  47.     {  
  48.         for(i = 0; i < nImgWidth; i++)  
  49.         {  
  50.             destpCxImage.SetPixelRGB(i, j, sourpImgbuf[j][i],sourpImgbuf[j][i],sourpImgbuf[j][i]);  
  51.         }  
  52.     }  
  53.   
  54.     return TRUE;  
  55. }  
  56.   
  57.   
  58. //24位真彩色  
  59. //CImage轉換成MYCOLORIMAGE  
  60. BOOL CxxImageToMYIMAGE(MYCOLORIMAGE destpImgbuf, CImage& sourpCxImage, int nImgWidth, int nImgHeight)  
  61. {  
  62.     // 參數檢查  
  63.     if(destpImgbuf.r == NULL || sourpCxImage == NULL || nImgWidth <= 0 || nImgHeight <= 0)  
  64.         return FALSE;  
  65.       
  66.     int i, j;  
  67.     COLORREF rgb;  
  68.     //24位轉換為24位存儲  
  69.     for(j = 0; j < nImgHeight; j++)  
  70.     {  
  71.         for(i = 0; i < nImgWidth; i++)  
  72.         {  
  73.             rgb=sourpCxImage.GetPixel(i, j);  
  74.             destpImgbuf.r[j][i] = GetRValue(rgb);  
  75.             destpImgbuf.g[j][i] = GetGValue(rgb) ;  
  76.             destpImgbuf.b[j][i] = GetBValue(rgb) ;  
  77.         }  
  78.     }  
  79.     return TRUE;  
  80. }  
  81.   
  82. //MYCOLORIMAGE轉換成CImage  
  83. BOOL MYIMAGEToCxxImage(CImage& destpCxImage, MYCOLORIMAGE sourpImgbuf, int nImgWidth, int nImgHeight)  
  84. {  
  85.     // 參數檢查  
  86.     if(destpCxImage == NULL || sourpImgbuf.r == NULL || nImgWidth <= 0 || nImgHeight <= 0)  
  87.         return FALSE;  
  88.   
  89.     int i, j;  
  90.     //24位轉換為24位存儲  
  91.     for(j = 0; j < nImgHeight; j++)  
  92.     {  
  93.         for(i = 0; i < nImgWidth; i++)  
  94.         {  
  95.             destpCxImage.SetPixelRGB(i, j,sourpImgbuf.r[j][i],sourpImgbuf.g[j][i],sourpImgbuf.b[j][i]);  
  96.         }  
  97.     }  
  98.   
  99.     return TRUE;  
  100. }  

1、程序示例,一個Laplacian算子進行銳化的例子。

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. //模版系數取1   
  2.      if  (m_Image.IsNull())   
  3.      return;   
  4.      BeginWaitCursor();  
  5.      if  (!m_Img.IsNull())   
  6.      m_Img.Destroy();  
  7.      m_Img.Create( m_Image.GetWidth(), m_Image.GetHeight(), 24,0);  
  8.      int  nWidth  =  m_Image.GetWidth();   
  9.      int  nHeight  =  m_Image.GetHeight();   
  10.      MYIMAGE RData=NULL;  
  11.      MYIMAGE GData=NULL;  
  12.      MYIMAGE BData=NULL;  
  13.      RData=MyImageAlloc(nHeight,nWidth);  
  14.      GData=MyImageAlloc(nHeight,nWidth);  
  15.      BData=MyImageAlloc(nHeight,nWidth);  
  16.      COLORREF color ;   
  17.        
  18.      for(int j = 0;j<nWidth;j++)  
  19.      for(int i = 0;i<nHeight; i++)  
  20.          {  
  21.           color = m_Image.GetPixel(j,i);   
  22.           RData[i][j]= GetRValue(color);      
  23.           GData[i][j]= GetGValue(color);     
  24.           BData[i][j]= GetBValue(color);   
  25.          }  
  26.            
  27.      int  templ[9]  =  {0,-1,0,-1,4,-1,0,-1,0};       
  28.       for  (int i  =  1;  i  <  nWidth-1;  i++)  
  29.     {   
  30.          for  (int j  =  1;  j  <  nHeight-1;  j++)  
  31.          {   
  32.                  int  r =  0,  g=  0,  b =  0;   
  33.                  int  index  =  0;   
  34.                  //模版1  
  35.                  for  (int  col  =  -1;  col  <=  1;  col++)  
  36.                  {   
  37.                        for  (int  row  =  -1;  row  <=  1;  row++)  
  38.                        {   
  39.                              r+=  RData[j+row][i+col] * templ[index];   
  40.                              g+=  GData[j+row][i+col] * templ[index];   
  41.                              b+=  BData[j+row][i+col] * templ[index];   
  42.                              index++;  
  43.                        }  
  44.                  }  
  45.                  if   (  r  <  0  )  r  =  -r;   
  46.                  else  if (  r  >  255  )  r  =  255;  
  47.                  if   (  g  <  0  )  g  = -g;   
  48.                  else  if  (  g  >  255  )  g  =  255;  
  49.                  if  (  b  <  0  )  b  = -b;   
  50.                  else  if  (  b  >  255  )  b  =  255;   
  51.                  m_Img.SetPixelRGB(i,j,r,g,b);  
  52.          }  
  53.      }  
  54.      MyImageFree(RData, nHeight);  
  55.      MyImageFree(GData, nHeight);  
  56.      MyImageFree(BData, nHeight);  
  57.      Invalidate();  
  58.      EndWaitCursor();    

2、比較:比較方便也比較快


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM