官术网_书友最值得收藏!

2.3 實踐拓展

由于圖像處理算法很多,如圖像特效顯示、圖像變換、圖像平滑、圖像增強、圖像分割等。這些算法都是本章所設計的ImageDib類所無法實現的。解決的方法有兩個,一個是在ImageDib類中直接添加成員函數來實現這些算法。但這勢必導致ImageDib類變得冗長和效率低下;另一個辦法就是利用Visual C++提供的派生類來實現這些算法。

ImageDib類的派生類設計原則如下:讓ImageDib類處理基本的圖像處理功能。如圖像讀取,顯示和存儲。而將需要處理的算法定義為ImageDib類的派生類。由于派生類對ImageDib基類中的保護或公有成員可以直接使用,不需要聲明,因此,在派生類中僅僅定義各種處理圖像數據的函數即可。這樣使不同處理功能歸結在不同的ImageDib派生類中,結構簡潔。

ImageDib類的派生類具有如下功能:

1)由于該類是從ImageDib類派生而來,因此具有ImageDib類的所有功能。

2)ImageDib類的派生類又擴充了一些功能,這些功能隨圖像處理算法的不同而不同。在編程中需要將圖像處理算法函數寫在該類中。每個處理算法編寫成從ImageDib類派生出的類的函數,因此,函數中可以直接使用ImageDib類中的變量和函數,不必加以聲明和定義。

例如,定義ImageDib基類的圖像反色變換派生類ImageTransform如下。

class ImageTransform:public ImageDib
{
    public:
        unsigned char * m_pImgDataOut;      //存儲圖像處理后數據
        ImageTransform();
        ~ ImageTransform();
        Void Transform();                   //圖像反色變換
};

而圖像反色變換處理實現函數如下。

ImageTransform::Transform()
{
    m_nBitCount;
    m_imgWidth;
    m_imgHeight;
    //每行像素占字節數,必須為4的倍數
    int lineByte=(m_imgWidth*m_nBitCount/8+3)/4*4;
    //申請空間,存放變換后結果
    m_pImgDataOut=new unsigned char[lineByte*m_imgHeight];
    //循環變量,圖像的坐標
    int i,j;
    //每像素占字節數
    int pixelByte=m_nBitCount/8;
    //循環變量,遍歷每個像素的每個分量,比如彩色圖像三個分量
    int k;
    //求反轉
    for(i=0;i<m_imgHeight;i++){
        for(j=0;j<m_imgWidth;j++){
            for(k=0;k<pixelByte;k++)
                *(m_pImgDataOut+i*lineByte+j*pixelByte+k)
                =255-*(m_pImgData+i*lineByte+j*pixelByte+k);
        }
    }
}

在此函數中待處理的圖像數據及其圖像屬性完全來自于基類ImageDib,即基類中指向圖像數據區的指針m_pImgData,圖像寬m_imgWidth,圖像高m_imgHeight和每像素所占位數m_nBitCount。而派生類ImageTransform則僅實現具體圖像處理算法Transform(),并把處理結果存入指針變量m_pImgDataOut所指的存儲區中。這樣,不論基類ImageDib加載的是什么樣的圖像,派生類ImageTransform都可以順利實現自己的圖像處理功能。

主站蜘蛛池模板: 贵南县| 聂荣县| 丰台区| 徐汇区| 甘德县| 临颍县| 太仆寺旗| 白沙| 南阳市| 蒲城县| 镇赉县| 儋州市| 城市| 淅川县| 郯城县| 县级市| 信丰县| 驻马店市| 奎屯市| 岳普湖县| 西丰县| 屏南县| 成武县| 鄂州市| 内江市| 永善县| 观塘区| 巫山县| 清苑县| 塘沽区| 正蓝旗| 抚顺县| 永康市| 唐河县| 宝山区| 汉沽区| 株洲县| 慈溪市| 长治县| 兴业县| 通榆县|