图像复制的问题
想做个类似录音机的程序,上面有左移的波形、频谱图。开始时用SetPixel实现,但是速度太慢,加上内存锁定也慢,后来用Clone实现,速度提高了不少,但是又发现了新问题。
程序电脑不能上网,代码简介如下:
我是在picturebox上绘图,picturebox.image = bmpWaterfall。先把bmpWaterafll右边图像(除去最左边1列像素的图像)clone给bmpTemp,再picturebox.drawImage(bmpTemp, rc),即在picturebox上图像左移1像素,再更新最右边一列像素。
运行正常,速度快,CPU占用率1%以下。但是我当我调整picturebox大小时会发现,当它大过了一个临界值时,CPU占用率会突升到20-30%,不知道怎么回事。我拿以前用C++写的程序看了下,即使全屏了CPU占用率也不会上升多少,很奇怪。
用C#写是因为要给别人做个控件,以前用C++ Builder,别人不方便调用。
希望这方面有经验的朋友帮看下问题何在。
------解决方案--------------------没试过。。帮你顶下吧。
------解决方案--------------------1,winform中picturebox是很耗内存的,所以微软发布了wpf,用它里面的Image控件会好很多;
2,你不需要处理一次就clone一次,只需要对一张图像多次处理,然后赋值给picturebox即可;
3,使用指针操作,不要用内存法;
------解决方案--------------------对于2,我的意思是你只对一张图像的信息进行处理,不需要处理一列就在clone一次,这样速度肯定慢;
对于3,C#做图像处理有三种方法:1,像素法,就是你的那个setpixel方法,这种最慢;2,内存法,是把图像信息从内存中clone到数组中进行处理,然后在复制到内存中去,速度比像素法快的多,但是对于较大图像,仍然比指针法慢;3,指针法,是用指针直接操作内存,速度可以比内存法快一个数量级以上,给你个博客,可以看一下,有内存法也有指针法http://dongtingyueh.blog.163.com/blog/#m=0
------解决方案--------------------
内存法不可能比指针法快的,这个你可以百度一下,图像越大,指针法的效果越明显;还有,我说的意思是你用指针法,指针指向你要处理的每一列进行处理,不需要进行clone,这个你可能理解错了,在想一下!
------解决方案--------------------不是这样的,内存法就是把图像信息从内存中拷贝到数组中进行处理,处理完后在从数组中拷贝到内存中去;
指针法不需要数组进行拷贝,而至用指针直接指向内存中的图像信息,对其进行操纵,这样它省去了向数组拷贝的过程,效率当然不一样了。
------解决方案--------------------你看这个吧,http://dongtingyueh.blog.163.com/blog/#m=0 ,这个上面的C#图像处理部分都是用的指针法,你好好看看方法就明白了。。。。。