最近写一个小工具,主要作用是删除图片中的内容。因为用.net开发,整理相关知识备用一下。
说明:文章中部分代码从微软MSDN引用,引用地址:http://msdn.microsoft.com/zh-cn/library/system.drawing.imaging.bitmapdata.scan0(v=VS.80).aspx
1、图像文件的处理方法:
1)使用System.drawing.Image加载图片文件(常用的gif,jpg,png格式都可以),加载后转成Bitmap,再用BitmapData进行操作。
示例代码如下:
' Create a new bitmap.
Dim bmp As New Bitmap("c:\fakePhoto.jpg")
' Lock the bitmap's bits.
Dim rect As New Rectangle(0, 0, bmp.Width, bmp.Height)
Dim bmpData As System.Drawing.Imaging.BitmapData = bmp.LockBits(rect, Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat)
' Get the address of the first line.
Dim ptr As IntPtr = bmpData.Scan0
2)再借助System.Runtime.InteropServices.Marshal,直接对加载的图像的内存信息操作,改变颜色值就可以达到修改图像内容的作用。(实现代码参见引用链接)
这样的操作方式主要是改进运行速度,虽然可以用setPix和getPix作类似的操作,但效率很差,如果图片分辨率高,程序会因处理时间太长而无响应。
2、图像内容的处理:
1)目标:首先扫描纸张内容,只保留纸张中打印(黑白打印机)留下的内容,其它干扰内容删除。
2)干扰内容分析:
纸张本身的颜色,因扫描机器的原因,纸张不一定成白色,首先处理的是纸张自己的灰色。测试后颜色值在120左右(上下各差15)范围的颜色,也可以在界面上设置滚动条,让用户根据生成效果自行调整。
非黑色的其它笔迹,打印机打印的是黑色(也包含亮度不足的灰色),这与其它颜色的最大差别在于,黑色值的RGB之间理论上是相等的,实际会有10到50的偏差,借助这个规律,将大于偏差的点删除,即可删除其它笔迹颜色。
笔迹加强,最好的方法是用3*3的卷积加强灰色的字迹,这里简单处理成以前后相信四个像素的均值为基准,将当前计算的像素颜色值像均值靠拢。基本上可以改进字迹的清晰度。
3)待处理问题:
图片像素较多时,处理速度还是比较慢的。即使在操作内存,循环一次所有像素,次数还是很多的。对蓝黑色(钢笔)处理能力有限,只起到模糊作用了。对铅笔类的处理也不好。