其實稍微想一下應該就可以知道~,只要在矩陣的某一個區塊,把那個區域的值加上一個數值,就可以得到這個效果。
程式碼:
#include <iostream> #include <cstdlib> #include "bmp.h" using namespace std; int R[MaxBMPSizeX][MaxBMPSizeY]; int G[MaxBMPSizeX][MaxBMPSizeY]; int B[MaxBMPSizeX][MaxBMPSizeY]; int width, height; int main(int argc, char* argv[]) { int x, y; int r, g, b; // 加強值 int value; char* file_name; // 圖檔名稱 file_name = "Butterfly.bmp"; // 開啟並讀取全彩(24bits)bmp 影像圖檔,如果是灰階影像只要存取RGB其中一項即可! // RGB 三個 channel 的值存入 R, G, B 三個自訂的陣列中 // 陣列大小規定是 MaxBMPSizeX * MaxBMPSizeY // 同時取得該影像圖檔的高度和寬度 open_bmp( file_name, R, G, B, width, height); // 影像處理(加強RGB形成半透明效果) // 設定增強值 value = 70; // 起始點, 以圖的左下角為原點 int startPointX = width / 4; int startPointY = height / 4; // 透明遮罩大小 int transparencyAreaWidth = 100; int transparencyAreaHeight = 200; // 影像處理(透明遮罩) for (x = startPointX ; x <= width * 3 / 4; x++) { for (y = startPointY ; y <= height * 3 / 4 ; y++) { r = R[x][y]; g = G[x][y]; b = B[x][y]; R[x][y] = r + value; G[x][y] = g + value; B[x][y] = b + value; // RGB之值不可大於255或小於0 if(R[x][y] > 255 ) { R[x][y] = 255; } else if (R[x][y] < 0) { R[x][y] = 0; } if(G[x][y] > 255 ) { G[x][y] = 255; } else if (G[x][y] < 0) { G[x][y] = 0; } if(B[x][y] > 255 ) { B[x][y] = 255; } else if (B[x][y] < 0) { B[x][y] = 0; } } } // 儲存處理結果至新的圖檔中 save_bmp("new_transparent.bmp", R, G, B); // 關閉 bmp 影像圖檔 close_bmp(); system("PAUSE"); return 0; }
下載點:
載點1 載點2
(執行環境Visual C 2012 不能執行請重新編譯)
沒有留言:
張貼留言
俗話說
凡走過必留下痕跡,凡住過必留下鄰居
凡爬過必留下樓梯,凡來過必留下IP
看過文章之後歡迎留下您寶貴的意見喔!