VS c++ 图像处理关于效率疑问,求大神指点。
大侠们,你们好,小弟新手有个问题很困惑,我用的是VS2010c++平台写的一个图像处理程序,思路就是想测试下从本地路径下读取一张比较大的位图图像,读入到一个char*类型...
大侠们,你们好,小弟新手有个问题很困惑,我用的是VS2010 c++平台写的一个图像处理程序,思路就是想测试下从本地路径下读取一张比较大的位图图像,读入到一个char*类型的内存变量M中,M变量里存放了整个图像的每个像素值数据,现在我想将数据写成保存成特定格式的图像文件,就用了FreeImage图形库的相关函数来进行图像文件的保存,首先用freeimage的相关函数新建位图获取内存首地址,然后用了两个for循环遍历访问新建位图的所有像素,并且用M里的每个元素值赋值给了新建的位图文件的每个像素值,最后确实能成功的保存为图像文件,但是发现这个过程有点慢,这个图像大小是5616*3744像素的尺寸,整个过程用了5到6秒的时间。。。。感觉效率也不高啊。。是因为图像过大呢还是不应该用这种循环遍历方式保存图像?感觉这个过程还有点麻烦,有没有简洁高效的方式将一个一维char*类型的图像数据保存为图像文件呢?这个速度确实不快。。谢谢
展开
展开全部
使用memcpy,500ms左右是需要的吧,毕竟瓶颈在读写文件。复杂压缩格式的图像瓶颈在它内部实现的压缩算法,这个外部也没法调优的
追问
大神,刚才我又测试了下,调试的时候发现执行完像素遍历的循环得到了FIBITMAP类的对象A后,就那句 FreeImage_save(FIF_PNG,A,PATH); 这句代码执行完很慢啊。。循环内存赋值过程执行完还是不慢的,这个就是瓶颈吗?还有这个memcpy怎么做,这个函数能取代for循环内存赋值过程?上面的解释有点不是很明白,能详细的说说么?如何解决这个慢的情况谢谢大侠指点啊。。。
追答
那么就是那个函数库实现的问题了,你试试用mspaint打开那个图像另存为一个png格式需要那么久么。
memcpy是拷贝一段内存,如果库函数只提供设置单一像素的接口就没法了。一般都会有设置某一行或某一块的像素值。
这个只是一种思维方法而已,你需要查找那个库是否有类似这样的接口。所有的图像处理和游戏图像渲染都依赖于引擎,调用者是没法做啥优化的,只能确保按设计者优化的接口调用
mspaint使用的是windows自带的gdk编程接口,只是内存中处理,但是多数接口传递参数都是传递一个指针,表示某个内存块
其他更快的图像处理比如direct,opengl都有各自的用法
东莞大凡
2024-08-07 广告
2024-08-07 广告
OpenCV标定板是东莞市大凡光学科技有限公司在相机标定中常用的工具。它通常由黑白格点按一定规则排列在平面上组成,如棋盘格或圆形格等。在相机标定时,将标定板置于不同位置和姿态下拍摄图像,利用OpenCV库中的函数检测标定板上的角点或圆心,进...
点击进入详情页
本回答由东莞大凡提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询