C#中的图像处理(附带生成马赛克范例)
来源:互联网 发布:校园网网络结构图 编辑:程序博客网 时间:2024/05/01 21:05
//读取本地图像
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
System.Drawing.Imaging.BitmapData bmpData =
bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
bmp.PixelFormat);
//Scan0获取或设置位图中第一个像素数据的地址。它也可以看成是位图中的第一个扫描行。简言之就是把当前指针设置在图像最左上角的位置。
byte[] rgbValues = new byte[bytes];
for (int counter = 0; counter < rgbValues.Length; counter+=3)
rgbValues[counter] = 255;
System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);
//解锁
很多图片处理的算法从原理上讲其实非常简单,难点往往在如何去写算法实现它,更加难的就是如何去优化实现的算法。
马赛克算法很简单,说白了就是把一张图片分割成若干个val * val像素的小区块(可能在边缘有零星的小块,但不影响整体算法),每个小区块的颜色都是相同的。为了方便起见,我们不妨让这个颜色就用该区域最左上角的那个点的颜色。当然还可以有其他方法,比如取区块中间点的颜色,或区块中随机点的颜色作代表等等。
下面的示意图就是取val=2的结果。
原图像素
ABCDEFG
HIJKLMN
OPQRSTU
VWXYZ01
2345678
马赛克处理后
AACCEEG
AACCEEG
OOQQSSU
OOQQSSU
2244668
public static Bitmap KiMosaic(Bitmap b, int val)
{
if (b.Equals(null))
{
return null;
}
int w = b.Width;
int h = b.Height;
int stdR, stdG, stdB;
stdR = 0;
stdG = 0;
stdB = 0;
BitmapData srcData = b.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
unsafe
{
byte* p = (byte*)srcData.Scan0.ToPointer();
for (int y = 0; y < h; y++)
{
for (int x = 0; x < w; x++)
{
if (y % val == 0)
{
if (x % val == 0)
{
stdR = p[2]; stdG = p[1]; stdB = p[0];
}
else
{
p[0] = (byte)stdB;
p[1] = (byte)stdG;
p[2] = (byte)stdR;
}
}
else
{
// 复制上一行
byte * pTemp = p - srcData.Stride;
p[0] = (byte)pTemp[0];
p[1] = (byte)pTemp[1];
p[2] = (byte)pTemp[2];
}
p += 3;
} // end of x
p += srcData.Stride - w * 3;
} // end of y
b.UnlockBits(srcData);
}
return b;
}
先上原图:
再上效果图
- C#中的图像处理(附带生成马赛克范例)
- 图像的采样(马赛克)
- canvas图像像素处理- 马赛克/滤镜(一)
- 图像处理 去模糊 去马赛克 软件
- 【Android图像处理】图像处理之-马赛克滤镜
- C#处理数码相片之马赛克的实现
- Win8 Metro(C#)数字图像处理--2.43图像马赛克效果算法
- 学习OpenCV范例(十)——图像平滑处理
- C#处理图片的范例
- C#对图片进行马赛克处理,可控制模糊程度
- 图像特效---马赛克滤镜
- 图像特效之马赛克
- c#图像处理-灰度处理(gray)
- iOS开发图片美白处理,图像处理,,磨皮,马赛克基于UIKit下自写算法
- 图像放大算法(马赛克效果)
- 鼠标马赛克图像部分区域
- C#图像处理(剪切、合成、缩略)
- C#图像处理(剪切、合成、缩略)
- JDK各文件夹作用。
- 修改打开gedit的默认编码为GB18030
- 什么是托管代码
- ASP.NET 文件上传
- Windows 7:找回被卸载的默认小工具
- C#中的图像处理(附带生成马赛克范例)
- [学习笔记]关于buttonMode
- 想翻译一下传说中的ACRM
- 有的时候话听听还可以,但不能照着做
- HTTP错误 大全 403 401 400 404 304 200
- 处女作
- spring下的webservice之xfire
- 不错的SQL面试题(一)
- S3c2440A平台HIVE注册表+binfs的实现