第一次接触C#。萌新想问关于picturebox与指针的问题。

qq_38774756 2017-10-27 10:19:03
驱动会将相机采集的数据送往已开好的共享内存IntPtr[] totalptr中;
然后我需要将指针里面的图像数据取出来显示。
如果用Intptr进行copy入byte[]数组。再通过内存流获取Image,然后利用picturebox进行绘图。这中间过程会浪费大量的时间。对于2500W像素的图像数据来说,这显示过程差不多是1秒6,7帧的样子。很明显的断断续续。

所以,大神们有没有什么好的办法来进行显示。再怎么都得争取15-20帧/s。这样的图像才会看着勉强连续。所以要么能直接将指针给到picturebox,让他绘图,要么通过更好的办法从指针指向的内存中获取Image。考虑在unsafe下用其他指针来进行此过程应该会节约不少时间,但是也应该达不到想要的要求。

或者不用picturebox,改用其他什么显示图像的方式。
总之,有没有好的办法,让我图像显示速度达到想要的最快速度。

谢谢各位了。
...全文
418 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_38774756 2017-10-30
  • 打赏
  • 举报
回复
引用 11 楼 njit_77 的回复:
应该是showimage = Image.FromStream(ms);影响速度吧,你试试Image.FromStream(ms);这样的速度,先不赋值 MemoryStream ms = new MemoryStream(data); Image.FromStream(ms);//我测试的时候只有这两句,1300W图片,36ms。不过我的图片大,你的4562432大小感觉太小了吧
这是开始的2500w的jgp图片,换成bmp速度也差不多。试了试把指针里数据写入Image[]数组里面的这个过程,用多个线程来完成,有些效果了。 谢谢回复,这几天忙着的
大鱼> 2017-10-30
  • 打赏
  • 举报
回复
C#里面没有指针概念的
njit_77 2017-10-30
  • 打赏
  • 举报
回复
引用 10 楼 qq_38774756 的回复:
[quote=引用 9 楼 njit_77 的回复:] 指针传数据应该不慢吧,或者你贴一些关键代码看看?
Marshal.Copy(totalptr[k], data, 0, 4562432); MemoryStream ms = new MemoryStream(data); showimage = Image.FromStream(ms); 也就这三句话data是我定义的一个byte数组。totalptr是Intptr型的指针数组(static IntPtr []totalptr)。按理说这也就内存流的方式而已,数据之间的转换也是在内存里面完成,但不知道为什么,这过程耗的时间加起来就显得贼慢[/quote] 应该是showimage = Image.FromStream(ms);影响速度吧,你试试Image.FromStream(ms);这样的速度,先不赋值 MemoryStream ms = new MemoryStream(data); Image.FromStream(ms);//我测试的时候只有这两句,1300W图片,36ms。不过我的图片大,你的4562432大小感觉太小了吧
真相重于对错 2017-10-28
  • 打赏
  • 举报
回复
预取一部分!
wooddy1982 2017-10-28
  • 打赏
  • 举报
回复
wooddy1982 2017-10-28
  • 打赏
  • 举报
回复
http://www.cnblogs.com/ysyn/p/3934554.html 对你有没有什么帮助。
qq_38774756 2017-10-28
  • 打赏
  • 举报
回复
引用 9 楼 njit_77 的回复:
指针传数据应该不慢吧,或者你贴一些关键代码看看?
Marshal.Copy(totalptr[k], data, 0, 4562432); MemoryStream ms = new MemoryStream(data); showimage = Image.FromStream(ms); 也就这三句话data是我定义的一个byte数组。totalptr是Intptr型的指针数组(static IntPtr []totalptr)。按理说这也就内存流的方式而已,数据之间的转换也是在内存里面完成,但不知道为什么,这过程耗的时间加起来就显得贼慢
njit_77 2017-10-28
  • 打赏
  • 举报
回复
引用 8 楼 qq_38774756 的回复:
[quote=引用 6 楼 njit_77 的回复:] 如果用Intptr进行copy入byte[]数组。再通过内存流获取Image,然后利用picturebox进行绘图。这中间过程会浪费大量的时间。这中间指的是哪部分过程?picturebox绘图? 不过2500w像素数据是有点多
2500W给到picturebox,picturebox自适应就能绘图出来,可能自带的显示图像算法比较好吧。关键浪费时间的是从Intptr里面取出Image和Bitmap,然后赋给picturebox这个过程。所以想问有没有什么好的办法让取出数据快一点。或者说换一种显示办法,不用picturebox,改用其他什么的方法,能不取出,直接给地址的那种。[/quote] 指针传数据应该不慢吧,或者你贴一些关键代码看看?
qq_38774756 2017-10-28
  • 打赏
  • 举报
回复
引用 6 楼 njit_77 的回复:
如果用Intptr进行copy入byte[]数组。再通过内存流获取Image,然后利用picturebox进行绘图。这中间过程会浪费大量的时间。这中间指的是哪部分过程?picturebox绘图? 不过2500w像素数据是有点多
2500W给到picturebox,picturebox自适应就能绘图出来,可能自带的显示图像算法比较好吧。关键浪费时间的是从Intptr里面取出Image和Bitmap,然后赋给picturebox这个过程。所以想问有没有什么好的办法让取出数据快一点。或者说换一种显示办法,不用picturebox,改用其他什么的方法,能不取出,直接给地址的那种。
qq_38774756 2017-10-28
  • 打赏
  • 举报
回复
引用 5 楼 hdt 的回复:
[quote=引用 4 楼 qq_38774756 的回复:] [quote=引用 3 楼 hdt 的回复:] 预取一部分!
谢谢你们的回复啊。预取一部分也要往Image[]数组里面放。也肯定放不了太多。预取的那部分显示完了,就得又自己慢慢取了。这样Intptr指针往Image转会显得很耗时。[/quote] 我认为的而解决方案是,先看看image有没有直接从intptr读取的? 如果没有,可以考虑一下人眼对于视频来说,有些误差是可以忽略的 比如你可以只显示奇数行,或者是显示奇数帧等等。[/quote] picturebox显示图像其实很快的。不需要只显示奇数行什么的。现在问题在于我把Intptr里面的Image或者Bitmap类型的图像对象取出来,然后赋给picturebox比较慢。picturebox的自适应显示图像算法还是很好的,图像给他就能不需要抽行抽列什么。关键就是取出图像数据来给他这个过程,很要命
njit_77 2017-10-28
  • 打赏
  • 举报
回复
引用 楼主 qq_38774756 的回复:
驱动会将相机采集的数据送往已开好的共享内存IntPtr[] totalptr中; 然后我需要将指针里面的图像数据取出来显示。 如果用Intptr进行copy入byte[]数组。再通过内存流获取Image,然后利用picturebox进行绘图。这中间过程会浪费大量的时间。对于2500W像素的图像数据来说,这显示过程差不多是1秒6,7帧的样子。很明显的断断续续。 所以,大神们有没有什么好的办法来进行显示。再怎么都得争取15-20帧/s。这样的图像才会看着勉强连续。所以要么能直接将指针给到picturebox,让他绘图,要么通过更好的办法从指针指向的内存中获取Image。考虑在unsafe下用其他指针来进行此过程应该会节约不少时间,但是也应该达不到想要的要求。 或者不用picturebox,改用其他什么显示图像的方式。 总之,有没有好的办法,让我图像显示速度达到想要的最快速度。 谢谢各位了。
如果用Intptr进行copy入byte[]数组。再通过内存流获取Image,然后利用picturebox进行绘图。这中间过程会浪费大量的时间。这中间指的是哪部分过程?picturebox绘图? 不过2500w像素数据是有点多
真相重于对错 2017-10-28
  • 打赏
  • 举报
回复
引用 4 楼 qq_38774756 的回复:
[quote=引用 3 楼 hdt 的回复:] 预取一部分!
谢谢你们的回复啊。预取一部分也要往Image[]数组里面放。也肯定放不了太多。预取的那部分显示完了,就得又自己慢慢取了。这样Intptr指针往Image转会显得很耗时。[/quote] 我认为的而解决方案是,先看看image有没有直接从intptr读取的? 如果没有,可以考虑一下人眼对于视频来说,有些误差是可以忽略的 比如你可以只显示奇数行,或者是显示奇数帧等等。
qq_38774756 2017-10-28
  • 打赏
  • 举报
回复
引用 3 楼 hdt 的回复:
预取一部分!
谢谢你们的回复啊。预取一部分也要往Image[]数组里面放。也肯定放不了太多。预取的那部分显示完了,就得又自己慢慢取了。这样Intptr指针往Image转会显得很耗时。

110,566

社区成员

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

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

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