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 對(duì)象指針
// 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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)隨機(jī)數(shù)生成的現(xiàn)代化封裝
在現(xiàn)代?C++?中,隨機(jī)數(shù)生成是許多程序設(shè)計(jì)中不可或缺的部分,例如游戲開發(fā)、算法設(shè)計(jì)、統(tǒng)計(jì)模擬等,本文將以一個(gè)封裝好的隨機(jī)工具類?Random?為例,深入剖析其功能的實(shí)現(xiàn)與使用,并引入相關(guān)知識(shí),幫助讀者觸類旁通,掌握?C++?隨機(jī)數(shù)的核心技巧2024-11-11
C語言數(shù)組應(yīng)用實(shí)現(xiàn)掃雷游戲
這篇文章主要為大家詳細(xì)介紹了C語言數(shù)組應(yīng)用實(shí)現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
C語言實(shí)現(xiàn)企業(yè)員工管理系統(tǒng)開發(fā)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)企業(yè)員工管理系統(tǒng)開發(fā),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
C語言實(shí)現(xiàn)學(xué)生檔案管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)學(xué)生檔案管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
OpenCV使用稀疏光流實(shí)現(xiàn)視頻對(duì)象跟蹤的方法詳解
這篇文章主要為大家詳細(xì)介紹了OpenCV如何使用稀疏光流實(shí)現(xiàn)視頻對(duì)象跟蹤功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2023-02-02

