请问,C#里面处理图像用GDI+太慢,如何能加快效率呢?

a254156374 2018-01-16 10:43:13
我的需求就是
1、加载一张2000x2000的图
2、旋转2000x2000的图30度
3、从旋转后的图中截取800x800的图
4、创建一个新的图,保存这个800x800的图
5、将新图保存到文件

以上需求,处理起来很慢,大概1分钟才能处理1000个的样子,而我需要的数量动辄100W、200W等,这一生成就要花1、2天。
有没有方法什么可以加速处理呢。
...全文
1104 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2018-01-16
  • 打赏
  • 举报
回复
其实就算是依赖 GDI+ 实现,也是有优化的余地的 既然是旋转后旋转,那么裁剪区在旋转前在原图的位置你是知道的(虽然是个菱形) 你可以裁剪出包围那个菱形的区域,只对这个小区域进行旋转,然后再取出你需要的部分 因为图片在旋转时要对每个目标点做插值运算,那是很耗时的工作 有可能的话,可用 openGL 去实现,但显然有点大材小用了
sdfgrtyu 2018-01-16
  • 打赏
  • 举报
回复
并行编程啊,
  • 打赏
  • 举报
回复
随便写点东西给你启发吧: 一个10像素大小的图片大致上可以看作保存为这样一个文件

00 10 20 30 40 50 60 70 80 90
01 11 21 31 41 51 61 71 81 91
02 12 22 32 42 52 62 72 82 92
03 13 23 33 43 53 63 73 83 93
04 14 24 34 44 54 64 74 84 94
05 15 25 35 45 55 65 75 85 95
06 16 26 36 46 56 66 76 86 96
07 17 27 37 47 57 67 77 87 97
08 18 28 38 48 58 68 78 88 98
09 19 29 39 49 59 69 79 89 99
你旋转缩小后的文件内容大致是这样的:

90 92 94 96 98
70 72 74 76 78
50 52 54 56 58
30 32 34 36 38
10 12 14 16 18
这是理想化,大致就是旋转就是行列转换,缩小就是色块取值(一般就是平均值,这中间有很多算法,不详述了)。
xuzuning 2018-01-16
  • 打赏
  • 举报
回复
按说 60ms 处理一张图片已经不算慢了,不过应该还是有提速的空间的 不使用 GDI+ 而是直接利用 BitmapData 自己搬运内存,至少一多半像素旋转的无用功是可以省去的
fontain2 2018-01-16
  • 打赏
  • 举报
回复
还有,图片处理可以先将图片转为矩阵,不要用getpixel之类的操作
fontain2 2018-01-16
  • 打赏
  • 举报
回复
加速的方法:1.处理图片的时候不要更新界面 2.多线程 3.读写磁盘动作集中在一起,这里其实效率没浪费在旋转上,界面更新和磁盘读写是性能杀手
xinbada1985 2018-01-16
  • 打赏
  • 举报
回复
这样的处理1分钟1000个应该速度已经很高了,性能上的改进应该不大了,最好就像2楼说的起一个多线程,但是因为图片太多所以不能所有一起进行,所以个人建议做一个队列,比如同时5个进行处理,其他处于等待!执行完一个下一个补上!同时处理几个主要看你的机器的性能!
  • 打赏
  • 举报
回复
就算一台,该多线程也就多线程啊
  • 打赏
  • 举报
回复
这么多图片还只用一台进行处理?
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/75333 直接给鱼吧。 http://www.codeforge.cn/article/71666 https://www.dssz.com/421084.html 旋转后你再缩放裁切就快多了,至于这个api本身有没有缩放裁切,我没研究部不知道。

110,502

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧