C++實(shí)現(xiàn)將圖片轉(zhuǎn)換為馬賽克效果的示例代碼
這個(gè)程序?qū)D片轉(zhuǎn)換為馬賽克效果。
算法原理:求出每個(gè)小方塊內(nèi)所有像素的顏色平均值,然后用來設(shè)置為該小方塊的顏色。依次處理每個(gè)小方塊,即可實(shí)現(xiàn)馬賽克效果。
完整代碼如下
// 程序名稱:將圖片轉(zhuǎn)換為馬賽克效果 // 編譯環(huán)境:Visual C++ 6.0 / 2010,EasyX_20200727 // #include <graphics.h> #include <conio.h> // 將圖片轉(zhuǎn)換為馬賽克效果 // 參數(shù): // pimg: 待處理的 IMAGE 對象指針 // tilesize: 馬賽克的尺寸 // startx: 馬賽克的平鋪起始位置 x 坐標(biāo) // starty: 馬賽克的平鋪起始位置 y 坐標(biāo) void Mosaic(IMAGE *pimg, int tilesize, int startx, int starty) { int width = pimg->getwidth(); // 圖像的寬 int height = pimg->getheight(); // 圖像的高 int redsum; // 紅色值的和 int greensum; // 綠色值的和 int bluesum; // 藍(lán)色值的和 int count; // 每個(gè)小方塊內(nèi)的像素?cái)?shù)量 int color; // 每個(gè)像素的顏色 int x, y, tx, ty; // 循環(huán)變量 // 獲取指向顯示緩沖區(qū)的指針 DWORD* pMem = GetImageBuffer(pimg); // 求出左上角第一個(gè)方塊的坐標(biāo) startx = (startx % tilesize == 0 ? 0 : startx % tilesize - tilesize); starty = (starty % tilesize == 0 ? 0 : starty % tilesize - tilesize); // 處理每一個(gè)小方塊 for (y = starty; y < height; y += tilesize) for (x = startx; x < width; x += tilesize) { // 清空累加值 redsum = greensum = bluesum = count = 0; // 求小方塊的紅、綠、藍(lán)顏色值的和 for (ty = min(y + tilesize, height) - 1; ty >= max(y, 0); ty--) for (tx = min(x + tilesize, width) - 1; tx >= max(x, 0); tx--) { color = pMem[ty * width + tx]; redsum += GetRValue(color); greensum += GetGValue(color); bluesum += GetBValue(color); count++; } // 求紅、綠、藍(lán)顏色的平均值 redsum /= count; greensum /= count; bluesum /= count; // 設(shè)置小方塊內(nèi)的每個(gè)像素為平均顏色值 color = RGB(redsum, greensum, bluesum); for (ty = min(y + tilesize, height) - 1; ty >= max(y, 0); ty--) for (tx = min(x + tilesize, width) - 1; tx >= max(x, 0); tx--) pMem[ty * width + tx] = color; } } // 主函數(shù) void main() { // 初始化繪圖環(huán)境 initgraph(640, 480); // 獲取圖像 IMAGE img; loadimage(&img, _T("c:\\test.jpg")); // 顯示原始圖像 putimage(0, 0, &img); // 任意鍵執(zhí)行 _getch(); // 將圖片轉(zhuǎn)換為馬賽克效果 Mosaic(&img, 10, 0, 0); // 顯示處理后的圖像 putimage(0, 0, &img); // 任意鍵關(guān)閉繪圖環(huán)境 _getch(); closegraph(); }
根據(jù)這個(gè)代碼,再加上點(diǎn)動(dòng)畫,還可以做出一些有趣的效果。
這里做一個(gè)例子,將前面代碼的以下兩行:
// 將圖片轉(zhuǎn)換為馬賽克效果 Mosaic(&img, 10, 0, 0); // 顯示處理后的圖像 putimage(0, 0, &img);
修改為:
IMAGE timg; for(int i = 2; i < 200; i++) { // 將圖片轉(zhuǎn)換為馬賽克效果 timg = img; Mosaic(&timg, i, 320, 240); // 顯示處理后的圖像 putimage(0, 0, &timg); Sleep(20); }
然后再執(zhí)行看看效果~~
到此這篇關(guān)于C++實(shí)現(xiàn)將圖片轉(zhuǎn)換為馬賽克效果的示例代碼的文章就介紹到這了,更多相關(guān)C++圖片轉(zhuǎn)馬賽克內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于C語言實(shí)現(xiàn)學(xué)生成績管理系統(tǒng)
這篇文章主要介紹了基于C語言實(shí)現(xiàn)學(xué)生成績管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01Qt使用QJson模塊實(shí)現(xiàn)解析Json文件
在項(xiàng)目開發(fā)過程中,經(jīng)常會(huì)遇到讀寫Json文件的需求,掌握J(rèn)son文件的操作是基礎(chǔ)中的基礎(chǔ),下面我們就來看看如何使用QT內(nèi)置的QJson模塊解析Json文件吧2023-10-10C++11中std::move、std::forward、左右值引用、移動(dòng)構(gòu)造函數(shù)的測試問題
這篇文章主要介紹了C++11中std::move、std::forward、左右值引用、移動(dòng)構(gòu)造函數(shù)的測試,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09C++ 多線程編程建議之 C++ 對多線程/并發(fā)的支持(下)
這篇文章主要介紹的是 C++ 多線程編程建議之 C++ 對多線程/并發(fā)的支持的相關(guān)資料,承接前文 現(xiàn)代 C++ 對多線程/并發(fā)的支持,接下來我們看看回發(fā)生什么吧2021-10-10對比C語言中g(shù)etc()函數(shù)和ungetc()函數(shù)的使用
這篇文章主要介紹了對比C語言中g(shù)etc()函數(shù)和ungetc()函數(shù)的使用,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-08-08