欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++實(shí)現(xiàn)將圖片轉(zhuǎn)換為馬賽克效果的示例代碼

 更新時(shí)間:2023年01月14日 08:40:16   作者:編程小魚六六六  
這篇文章主要為大家詳細(xì)介紹了C++如何實(shí)現(xiàn)將圖片轉(zhuǎn)換為馬賽克效果,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下

這個(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)文章

最新評論