c# 图片绘制速度

aikeli1234567 2010-02-07 02:30:21
合成图片源码:
elements是6个Bitmap对象数组

合成一张图片的时间约莫1秒,由于项目每次要多次合成图片,每次要耗费时间7、8秒,速度太慢,希望高手提供更好的方法!

this.s_image = new Bitmap(this.Body.Width, this.Body.Height);
Graphics g = Graphics.FromImage(this.s_image);
for (int i = 0; i < elements.Length; i++)
{
if (elements[i] != null)
{
if (i != 4)
{
g.DrawImage(elements[i], p_list.PointArray[i].X, p_list.PointArray[i].Y, this.Body.Width, this.Body.Height);
}
else
{
if (has_glassses)
{
g.DrawImage(elements[i], p_list.PointArray[i].X, p_list.PointArray[i].Y, this.Body.Width, this.Body.Height);
}
}
}
}
g.Dispose();
...全文
1295 50 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
50 条回复
切换为时间正序
请发表友善的回复…
发表回复
卧_槽 2010-02-26
  • 打赏
  • 举报
回复
按我的方法还没搞定就别瞎折腾了。
virtools2008 2010-02-20
  • 打赏
  • 举报
回复
支持,学习了,帮顶!!!!!!!!!!
jin20000 2010-02-20
  • 打赏
  • 举报
回复
我只能说我顶!!!!!!!
aikeli1234567 2010-02-20
  • 打赏
  • 举报
回复
引用 44 楼 zanfeng 的回复:
不知道你的合成图片是嘛意思???
为什么要一个象素一个象素的弄。直接画整个图片不可以嘛??g.DrawImage(picture)

就是直接整张图片进行绘制的啊,可是速度太慢啦!
aikeli1234567 2010-02-19
  • 打赏
  • 举报
回复
都没有解决啊!谁还有其他好的方法?高手给个解决方案!
wwwqdd 2010-02-19
  • 打赏
  • 举报
回复
学习了,帮顶啦,向大侠们学习啦.
足球中国 2010-02-19
  • 打赏
  • 举报
回复
不知道你的合成图片是嘛意思???
为什么要一个象素一个象素的弄。直接画整个图片不可以嘛??g.DrawImage(picture)
lljfl 2010-02-11
  • 打赏
  • 举报
回复
路过,
友情帮顶!
aikeli1234567 2010-02-11
  • 打赏
  • 举报
回复
引用 32 楼 yuwenge 的回复:
其实,有快速的方法,不过你要支持透明图层就麻烦太大了。
首先,检测最后一张图片,完全不透明的点,先绘制上去,因为他们会把前面35张都挡掉,也就是前面35张都百画了。
然后检测透明点(alpha不为255的点)。
对于每一个不透明点,检测35--1张,发现有alpha==255的点,则不再往前检测。比如,23-35的这一点alpha值都小于255,22张的这一点alpha为255.则只需要计算22--36的像素半透明融合。


这个算法可以在非常大程度上改进速度,但是也要看你的36张图具体而言。比如第36张为全不透明,那几十毫秒就结束了。
如果36张全他妈的是半透明的,那没办法,10s钟

像素覆盖融合算法自己找找吧,我写过,但是忘记扔哪里去了。

谢谢,我再试试
wzuomin 2010-02-11
  • 打赏
  • 举报
回复
引用 25 楼 harvey_he 的回复:
C# code//内存法,大概2.5毫秒一张.privatevoid memory_Click(object sender, EventArgs e)
{if (curBitmap!=null)
{
myTimer.ClearTimer();
myTimer.Start();
?-



这个方法怎么样?
aikeli1234567 2010-02-11
  • 打赏
  • 举报
回复
引用 40 楼 bingo_ 的回复:
要速度快 去研究图象学

怎么去学,都要学习那些知识?想过很多方法,都没有成功!
bingo_ 2010-02-11
  • 打赏
  • 举报
回复
要速度快 去研究图象学
aikeli1234567 2010-02-11
  • 打赏
  • 举报
回复
引用 38 楼 mowanglijiang 的回复:
肯定是哪里做错了,我好久没弄这方面的了,以前弄游戏,那图片数量比你这个多多了,最后不也是需要合成个画面显示到屏幕上,要是像你做的需要六七秒,那游戏不就比放幻灯片还慢?

我合成图片的目的不是显示到屏幕上,而是将PNG非透明部分合成在一起成新的图片!并不是拼接而是合层透明显示!
上海程序员3 2010-02-11
  • 打赏
  • 举报
回复
肯定是哪里做错了,我好久没弄这方面的了,以前弄游戏,那图片数量比你这个多多了,最后不也是需要合成个画面显示到屏幕上,要是像你做的需要六七秒,那游戏不就比放幻灯片还慢?
aikeli1234567 2010-02-11
  • 打赏
  • 举报
回复
引用 36 楼 castlooo 的回复:
哥们是搞啥的啊?
帮顶

编码
castlooo 2010-02-11
  • 打赏
  • 举报
回复
哥们是搞啥的啊?
帮顶
aikeli1234567 2010-02-10
  • 打赏
  • 举报
回复
引用 30 楼 yuwenge 的回复:
我大概明白了,你有36张A4大小的图片,要一层一层涂在一起。
也就是要绘制36张A4大小的图。
A4大小2479x3508像素
每个像素4个通道。
每次绘制,需要计算颜色重叠,也就是2479*3508*4*3*36=3756815424次乘法运算。
37亿次乘法运算。
cpu累死了,大哥。怎么着也要6,7秒啊。
除非你能自己重写图片重叠的算法,并且能优化它。
万一你写出来了,记得去申请个专利,卖个100w没问题。

这么说,不可能再提速了!无奈啊!
卧_槽 2010-02-10
  • 打赏
  • 举报
回复
其实,有快速的方法,不过你要支持透明图层就麻烦太大了。
首先,检测最后一张图片,完全不透明的点,先绘制上去,因为他们会把前面35张都挡掉,也就是前面35张都百画了。
然后检测透明点(alpha不为255的点)。
对于每一个不透明点,检测35--1张,发现有alpha==255的点,则不再往前检测。比如,23-35的这一点alpha值都小于255,22张的这一点alpha为255.则只需要计算22--36的像素半透明融合。


这个算法可以在非常大程度上改进速度,但是也要看你的36张图具体而言。比如第36张为全不透明,那几十毫秒就结束了。
如果36张全他妈的是半透明的,那没办法,10s钟

像素覆盖融合算法自己找找吧,我写过,但是忘记扔哪里去了。
aikeli1234567 2010-02-09
  • 打赏
  • 举报
回复
麻烦大家帮帮忙!解决问题啊!困了好久啦!
aikeli1234567 2010-02-09
  • 打赏
  • 举报
回复
补充一下,合成图片时存在分层覆盖,透明显示显示效果,所有的图片都是绘画到同等大小的A4图片上!非透明处合成一个图像!
加载更多回复(27)

111,097

社区成员

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

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

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