如何在Compact Framework上将PictureBox.Image设置为* .jpg-File?

时间:2016-03-03 12:53:49

标签: c# visual-studio-2008 jpeg compact-framework windows-ce

我正在尝试使用Windows CE在面板PC上开发照片幻灯片。我要在我的公式上的PictureBox中显示的每个图像都是* .jpg-Type。文件是例如~1MB大,分辨率为2304x1728。 当我使用下面的代码时,我得到一个OutOfMemory Exception。

Bitmap bitmap = new Bitmap(file_name)
PictureBox.Image = bitmap

经过研究,我发现* .jpg-Files可能“太大”而无法适应Bitmap。使用VS2008上的Compact Framework,我不可能使用类似

的内容
Image image1 = Image.From(file_name)

如何从jpg-Files到我的PictureBox获取图像?

EDIT [1]:

感谢您的评论。我发现我的图片无法正确加载,因为我的设备没有足够的内存来临时加载“巨大”的图像。我在将图像复制到设备之前编写了一些调整图像大小的代码,从而解决了这个问题。

        Image bitmapNew = null;
        using (Bitmap bitmap = (Bitmap)Image.FromFile(filename))
        {
            double proportion = (double) bitmap.Width / bitmap.Height;
            proportion = Math.Round(proportion, 2);
            if (proportion > 1)
            {
               iWidth = iWidthMax;
               iHeight = (int)(iWidthMax / proportion);
            }
            else
            {
               iHeight = iHeightMax;
               iWidth = (int) (iHeightMax * proportion);
            }
            bitmapNew = new Bitmap(bitmap, new Size(iWidth, iHeight));

       }

设备的分辨率定义参数iWidthMax& iHeightMax

1 个答案:

答案 0 :(得分:1)

JPG或任何其他压缩图像文件类型的文件大小并未说明存储了多少像素(5,10或更多像素)。要在屏幕上显示图像,必须将所有像素加载到内存中。对于较大的图像,这是不可能的,尤其是在具有32MB处理插槽限制的Windows Mobile上。 即使可以加载整个图像也没有意义,因为屏幕没有那么多的像素,只会显示每10或20个像素。

最好的方法是仅加载屏幕和内存可以处理的内容。标准类都是基于内存的,因此您将很早达到内存限制。但是有OpenNetCF可以扩展'仅使用文件流即时运行图像。

我在https://github.com/hjgode/eMdiMail/blob/master/ImagePanel/ImageHelper.cs中使用它来获取加载和显示有意义的缩放图像。查看getScaledBitmap()和CreateThumbnail()的代码。这些函数是代码中自定义控件的一部分,但可以很容易地用于其他目的。

该项目用于扫描文档或名片,将其显示为拇指并进行缩放,然后将扫描图像通过电子邮件发送到文档服务器。