C++影像處理 -- 映像翻轉(鏡像)__C++

來源:互聯網
上載者:User

閱讀提示

    《C++影像處理》系列以代碼清晰,可讀性為主,全部使用C++代碼。

    《Delphi影像處理》系列以效率為側重點,一般代碼為PASCAL,核心代碼採用BASM。

    儘可能保持二者內容一致,可相互對照。

    本文代碼必須包括《C++影像處理 -- 資料類型及公用函數》文章中的BmpData.h標頭檔。

 

    對映像的翻轉處理,是產生一個與原映像在水平方向或者垂直方向相對稱的鏡像映像。

    映像翻轉的原理很簡單,就是以映像的中間列像素(水平方向),或者中間行像素(垂直方向)為基列(行),將映像第一列(行)的像素與映像最後一列(行)的像素相交換,映像第二列(行)的像素與映像倒數第二列(行)的像素相交換......,直至基列(行)為止,如果映像的列(行)數是偶數,則頭尾對應的列(行),包括基列(行)在內兩兩交換,如果映像的列(行)數是偶數,則基列(行)不變,其它頭尾對應的列(行)兩兩交換。

    下面是映像翻轉的實現代碼和例子程式(使用BCB2010和GDI+):

//---------------------------------------------------------------------------typedef enum{ReversalModeHorizontal,// 水平翻轉ReversalModeVertical// 垂直翻轉}ReversalMode;// 映像翻轉(鏡像)VOID ImageReversal(BitmapData *data, ReversalMode mode){UINT width = data->Width;UINT height = data->Height;INT srcOffset = data->Stride >> 2;INT dstOffset, delta;PARGBQuad pd, ps;ARGB color;if (mode == ReversalModeHorizontal){pd = (PARGBQuad)data->Scan0;ps = pd + width - 1;dstOffset = srcOffset;delta = -1;width >>= 1;}else{ps = (PARGBQuad)data->Scan0;pd = ps + (height - 1) * srcOffset;dstOffset = -srcOffset;delta = 1;height >>= 1;}for (UINT y = 0; y < height; y ++, pd += dstOffset, ps += srcOffset){PARGBQuad pd0 = pd;PARGBQuad ps0 = ps;for (UINT x = 0; x < width; x ++, pd0 ++, ps0 += delta){color = pd0->Color;*pd0 = *ps0;ps0->Color = color;        }}}//---------------------------------------------------------------------------void __fastcall TForm1::Button3Click(TObject *Sender){Gdiplus::Bitmap *bmp =  new Gdiplus::Bitmap(L"..\\..\\media\\IMG_9440_mf.jpg");Gdiplus::Graphics *g = new Gdiplus::Graphics(Canvas->Handle);// 畫原圖g->DrawImage(bmp, 0, 0);BitmapData data;LockBitmap(bmp, &data);ImageReversal(&data, ReversalModeHorizontal);UnlockBitmap(bmp, &data);// 畫翻轉後的鏡像圖g->DrawImage(bmp, data.Width, 0);delete g;delete bmp;}//---------------------------------------------------------------------------

    例子運行後的鏡像效果圖如下,左邊是原圖,右邊是水平鏡像圖:

 

    因水平有限,錯誤在所難免,歡迎指正和指導。郵箱地址:maozefa@hotmail.com

    這裡可訪問《C++影像處理 -- 文章索引》。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.