在我写的.NET CF应用程序中,其中一个功能是从远程摄像头获取帧。帧作为单个jpeg图像获取,并在可用时显示在屏幕上。
这是一个足够好的解决方案,但我不喜欢将流转换为Image
对象所需的时间,Bitmap()
构造函数是远远远大于下载流所需的时间。
当我浏览一些博客来搜索此问题时,我发现有些开发人员正在使用Image.FromStream()
方法,该方法具有validateImageData
标志,似乎可以控制某些验证码。当validateImageData
为false时,转换速度会大大加快。
好,我想......但是Compact Framework没有实现这个方法!
任何人都知道如何绕过它,或者至少如何将流转换为Image
而没有不必要的延迟?
答案 0 :(得分:1)
如果JPEG的尺寸很大(如1200 x 1600或其他),那么您在设备上使用Bitmap构造函数遇到的速度问题之一就是必须在内存中创建Bitmap的大小(位图也将是1200 x 1600,即使它然后显示在240 X 320屏幕上)。如果您可以检索已经大小为320 X 240的JPEG而不是全尺寸的JPEG,则位图创建时间应该少得多。
除了Bitmap构造函数之外,我找不到丢失的FromStream方法的任何替代方法。如果您熟悉JPEG格式,我认为编写自己的JPEG-to-BMP转换器并不太难,但我猜它不会比Bitmap()快。
编辑:抱歉,我的意思是你自己推出的转换器在将240 X 320 JPEG转换为240 X 320位图时速度不会更快。我认为将更大的JPEG转换为240 X 320位图可以更快,因为它可以跳过首先创建全尺寸位图的步骤。
答案 1 :(得分:1)
不确定这是否有帮助,但OpenNETCF.Drawing.Imaging具有从流中读取图像的类,但它们是IImage包装的com对象。然后,您可以使用IImage.Draw将其绘制到您的位图上。它还有一个GetThumbnail方法,我用它来获取设备上大型jpeg的缩放图像。
Here是来自Alex Feinman的博客文章。