程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 通用圖像類算法擴充庫

通用圖像類算法擴充庫

編輯:關於VC++

這是一個比較另類的圖像庫,它本身並不提供對圖像對象的封裝,只以類似插件的形式為您提供圖像處理算法的封裝和進度顯示,而圖像對象的封裝則需由用戶來提供。本圖像庫平台無關,理論上它可以應用於任何已有的C++圖像類上。(具體原理請參看本人拙作:Crazybit開發手記(一):設計之數據結構和算法的分離)。

使用方法

為了使用本圖像庫,您必須對手頭的圖像類做一些簡單的修改(考慮到效率的因素,我並沒有提供一個虛接口供大家繼承,而是通過讓用戶自己修改代碼來實現之。):

1、從現有圖像類(如CxImage、CDib...)派生出FCObjImage(我想您的類也叫這個名字的概率應該比火星有水的概率要低^-^)。

2、.您必須在FCObjImage類中實現以下函數(大多是很簡單的取屬性操作):

原型

功能說明

FCObjImage () 默認構造函數 FCObjImage (const FCObjImage & img) 拷貝構造函數 FCObjImage & operator= (const FCObjImage & imgSrc) 賦值操作 BOOL IsValidImage () const 本圖像對象是否有效 UINT16 ColorBits () const 圖像的顏色位數(1,4,8,16,24,32) DWORD GetPitch () const 圖像每行字節數 BYTE * GetBits (int iLine = 0) const 取得第 iLine 行指針, 左上角為(0,0), 自上而下 BYTE * GetBits (int x, int y) const 取得 (x,y) 點的指針, 左上角為(0,0), 自上而下,自左而右 bool IsInside (int x, int y) const 坐標(x,y)是否在圖像內部 int Width () const 寬 int Height () const 高 BOOL Create (int iWidth, int iHeight, WORD wColorBit) 創建一副空圖像 static void fooCopyPalette (FCObjImage & DibDest, const FCObjImage & DibSrc) <=8bit圖像拷貝調色板

3、現在,進入最重要的一環,在FCObjImage類中添加方法:

void SinglePixelProcessProc (FCSinglePixelProcessBase & PixelProcessor, FCObjProgress * progress = NULL)

並把下面的實現代碼拷到FCObjImage類中:

//================================================================
void FCObjImage::SinglePixelProcessProc (FCSinglePixelProcessBase & PixelProcessor, FCObjProgress * progress)
{
  if (!PixelProcessor.ValidateColorBits (this))
    return ;

  // 計算處理區域
  RECT    rcImg = {0,0,Width(),Height()}, rcBlock, rcDest ;
  if (PixelProcessor.GetProcessRect() == NULL)
    ::CopyRect (&rcBlock, &rcImg) ;
  else
    ::CopyRect (&rcBlock, PixelProcessor.GetProcessRect()) ;
  if (::IntersectRect (&rcDest, &rcImg, &rcBlock) == 0)
    return ; // 處理區域為空

  // 處理前准備工作
  int   nSpan = ColorBits() / 8 ; // 每象素字節數1, 2, 3, 4
  PixelProcessor.OnEnterProcess (this, rcDest) ;

  // 遍歷處理區域像素
  for (int y=rcDest.top ; y < rcDest.bottom ; y++)
  {
    BYTE  * pPixel = GetBits (rcDest.left, y) ;
    for (int x=rcDest.left ; x < rcDest.right ; x++, pPixel += nSpan)
    {
      PixelProcessor.ProcessPixel (this, x, y, pPixel) ;
    }
    if (progress != NULL)
      progress->SetProgress (y * 100 / Height()) ;
  }

  // 收尾工作
  PixelProcessor.OnLeaveProcess (this) ;
}//================================================================

4、修改庫裡的 PixelProcessor.cpp 文件,把FCObjImage所在的.h文件包含進去。

現在,您就可以通過如下方法調用本庫:

imgTest.SinglePixelProcessProc (FCPixelGrayscale()) ;
  imgTest.SinglePixelProcessProc (FCPixelInvert()) ;
  ......

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved