CodeBus

分享代码,一起进步~

[图像处理] 将图片转换为马赛克效果

这个程序将图片转换为马赛克效果。 算法原理:求出每个小方块内所有像素的颜色平均值,然后用来设置为该小方块的颜色。依次处理每个小方块,即可实现马赛克效果。 完整代码如下: ///////////////////////////////////////////////////////// // 程序名称:将图片转换为马赛克效果 // 编译环境:Visual C++ 6.0 / 2010,EasyX 20130322(beta) // 作 者:krissi <zh@easyx.cn> // 最后修改:2013-4-22 // #include <graphics.h> #include <conio.h> // 将图片转换为马赛克效果 // 参数: // pimg: 待处理的 IMAGE 对象指针 // tilesize: 马赛克的尺寸 // startx: 马赛克的平铺起始位置 x 坐标 // starty: 马赛克的平铺起始位置 y 坐标 void Mosaic(IMAGE *pimg, int tilesize, int startx, int starty) { int width = pimg->getwidth(); // 图像的宽 int height = pimg->getheight(); // 图像的高 int redsum; // 红色值的和 int greensum; // 绿色值的和 int bluesum; // 蓝色值的和 int count; // 每个小方块内的像素数量 int color; // 每个像素的颜色 int x, y, tx, ty; // 循环变量 // 获取指向显存的指针 DWORD* pMem = GetImageBuffer(pimg); // 求出左上角第一个方块的坐标 startx = (startx % tilesize == 0 ? 0 : startx % tilesize - tilesize); starty = (starty % tilesize == 0 ? 0 : starty % tilesize - tilesize); // 处理每一个小方块 for (y = starty; y < height; y += tilesize) for (x = startx; x < width; x += tilesize) { // 清空累加值 redsum = greensum = bluesum = count = 0; // 求小方块的红、绿、蓝颜色值的和 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++; } // 求红、绿、蓝颜色的平均值 redsum /= count; greensum /= count; bluesum /= count; // 设置小方块内的每个像素为平均颜色值 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; } } // 主函数 void main() { // 初始化绘图环境 initgraph(640, 480); // 获取图像 IMAGE img; loadimage(&img, _T("c:\\test.jpg")); // 显示原始图像 putimage(0, 0, &img); // 任意键执行 getch(); // 将图片转换为马赛克效果 Mosaic(&img, 10, 0, 0); // 显示处理后的图像 putimage(0, 0, &img); // 任意键关闭绘图环境 getch(); closegraph(); } 根据这个代码,再加上点动画,还可以做出一些有趣的效果。 这里做一个例子,将前面代码的以下两行: // 将图片转换为马赛克效果 Mosaic(&img, 10, 0, 0); // 显示处理后的图像 putimage(0, 0, &img); 修改为: IMAGE timg; for(int i = 2; i < 200; i++) { // 将图片转换为马赛克效果 timg = img; Mosaic(&timg, i, 320, 240); // 显示处理后的图像 putimage(0, 0, &timg); Sleep(20); } 然后再执行看看效果~~

[图像处理] 将图片进行模糊处理

这个程序实现将图片进行模糊处理。 本程序的模糊处理算法:遍历图片像素,将每个像素颜色值与其周围像素颜色值求和,取平均值对其赋值。 完整代码如下: ///////////////////////////////////////////////////////////////////////// // 程序名称:将图片进行模糊处理 // 编译环境:Visual C++ 6.0 / 2010,EasyX 20130114(beta) // 作  者:krissi <zh@easyx.cn> // 最后修改:2013-1-19 // #include <graphics.h> #include <conio.h> // 将图片进行模糊处理 void Blur(IMAGE *pimg) { DWORD* pMem = GetImageBuffer(pimg); COLORREF color; int r, g, b; int num = 0; int width = pimg->getwidth(); int height = pimg->getheight(); // 计算 9 格方向系数 int cell[9] = {-(width + 1), - width, -(width - 1), -1, 0, 1, width - 1, width, width + 1}; // 逐个像素点读取计算 for(int i = width * height - 1; i >= 0; i--) { // 累加周围 9 格颜色值 for(int n=0, m=0; n < 9; n++) { // 位置定位 num = i+cell[n]; // 判断位置值是否越界 if(num < 0 || num >= width * height) { color = RGB(0, 0, 0); // 将越界像素赋值为0 m++; // 统计越界像素数 } else color = pMem[num]; // 累加颜色值 r += GetRValue(color); g += GetGValue(color); b += GetBValue(color); } // 将平均值赋值该像素 pMem[i] = RGB(r / (9 - m), g / (9 - m), b / (9 - m)); r = g = b = 0; } } // 主函数 void main() { // 初始化绘图环境 initgraph(640, 480); // 获取图像 IMAGE img; loadimage(&img, _T("c:\\test.jpg")); // 显示原始图像 putimage(0, 0, &img); // 任意键执行 getch(); // 模糊处理 10 次 for(int m =0; m < 10; m++) Blur(&img); // 显示处理后的图像 putimage(0, 0, &img); // 任意键关闭绘图环境 getch(); closegraph(); }

[图像处理] 彩色图片转化成底片效果

这个程序实现将图片转化成底片效果。 底片效果使用如下公式: R = 0xFF - GetRValue(pMem[i]); G = 0xFF - GetGValue(pMem[i]); B = 0xFF - GetBValue(pMem[i]); 完整代码如下: ///////////////////////////////////////////////////////// // 程序名称:底片效果 // 编译环境:Visual C++ 6.0 / 2010,EasyX 20130114(beta) // 作 者:krissi <zh@easyx.cn> // 最后修改:2013-1-20 // #include <graphics.h> #include <conio.h> // 底片效果 void ColorInvert(IMAGE *pimg) { // 获取指向显存的指针 DWORD* pMem = GetImageBuffer(pimg); // 直接对显存赋值 for(int i = pimg->getwidth() * pimg->getheight() - 1; i >= 0; i--) pMem[i] = (~pMem[i]) & 0x00FFFFFF; } // 主函数 void main() { // 初始化绘图环境 initgraph(640, 480); // 获取图像 IMAGE img; loadimage(&img, _T("c:\\test.jpg")); // 显示原始图像 putimage(0, 0, &img); // 任意键执行 getch(); // 底片效果 ColorInvert(&img); // 显示处理后的图像 putimage(0, 0, &img); // 任意键关闭绘图环境 getch(); closegraph(); }

[图像处理] 彩色图像转换为灰度图像

这个程序实现将彩色图像转换为灰度图像。 彩色转换为灰度使用如下公式: Gray = R * 0.299 + G * 0.587 + B * 0.114为了提高运算速度,将这个公式转换为整数运算: Gray = (R * 229 + G * 587 + B * 114 + 500) / 1000为了提高运算速度的方法还有很多,这里作为演示,不再详述。 完整代码如下: ///////////////////////////////////////////////////////// // 程序名称:彩色图片转换为灰阶图片 // 编译环境:Visual C++ 6.0 / 2010,EasyX 20130322(beta) // 作 者:krissi <zh@easyx.cn> // 最后修改:2013-1-19 // #include <graphics.h> #include <conio.h> // 彩色图像转换为灰度图像 void ColorToGray(IMAGE *pimg) { DWORD *p = GetImageBuffer(pimg); COLORREF c; // 逐个像素点读取计算 for(int i = pimg->getwidth() * pimg->getheight() - 1; i >= 0; i--) { c = BGR(p[i]); c = (GetRValue(c) * 299 + GetGValue(c) * 587 + GetBValue(c) * 114 + 500) / 1000; p[i] = RGB(c, c, c); // 由于是灰度值,无需再执行 BGR 转换 } } // 主函数 void main() { // 初始化绘图环境 initgraph(640, 480); // 获取图像 IMAGE img; loadimage(&img, _T("c:\\test.jpg")); // 显示原始图像 putimage(0, 0, &img); // 按任意键转换为灰度图像 getch(); // 处理图像为灰度 ColorToGray(&img); // 显示处理后的图像 putimage(0, 0, &img); // 关闭绘图环境 getch(); closegraph(); }