c#学习(2):大图片的特效处理与获取屏幕任一点RGB值

来源:互联网 发布:奉化淘宝司法拍卖网 编辑:程序博客网 时间:2024/04/30 17:20

 

这里的大图片是指3M左右的图片,笔者所做的图片特效大约分为两种,一种是通过picturebox控件的变换而实现的,这类特效较为简单,其效率与图片本身并无关系;第二类是通过数值计算,利用计时器控制图片像素的显示,分块显示图片,例如百叶窗特效,旋转特效,马赛克特效等,这类特效的效率与图片本身的大小有很大关系。下边通过百叶窗的实现详细讲述一下如何高效的实现此类特效。

           首先,打开一幅3M左右的图片(2152*1426),如果对其不做任何处理,首先或其各个像素的rgb值,二次循环,大约要计算2152*1426次,仅仅打开图片就要花掉3-4s的时间,进行百叶窗的计算时,大约耗费掉了系统130多M的内存。那么,如何对打开的图片进行简单的处理呢?其实,并不需要用到如无损压缩、格式变换等技术,只需要在进行百叶窗特效前对图片做一点小手脚,因为我的控件图像显示模式StretchImage模式(picturebox1.sizemode=pictureboxsizemode.StretchImage),就是说,无论这个图片在windows图片查看器里面积有多大,在picturebox中的面积适中要服从picturebox的大小,如果将所有图片大小都压缩成为一个统一的格式,人眼是无法分辨的。具体地说就是根据picturebox的宽高提取每一点的像素值(注意:虽然放在控件中的图片面积改变了,但是所占用的内存是不变的,而且计算机中的image.width和image.height是不变的,依然是2152*1426,而控件可能只是350*240),然后将所有像素复制到另一幅位图中,将这幅位图重新放到picturebox中。具体实现如下:

 

 

百叶窗

 

原创粉丝点击