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

How to set PictureBox.Image to *.jpg-File on Compact Framework?

我正在尝试在带有 Windows CE 的平板电脑上制作照片幻灯片。我想在公式的 PictureBox 中显示的每个图像都是 *.jpg 类型。文件例如~1MB 大小,分辨率为 2304x1728。 当我使用以下代码时,出现 OutOfMemory 异常。

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

经过研究我发现 *.jpg 文件可能 "too big" 适合位图。使用 VS2008 上的 Compact Framework,我不可能使用类似

的东西
Image image1 = Image.From(file_name)

如何从 jpg 文件中获取图像到我的 PictureBox 中?

编辑[1]:

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

        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

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

最好的方法是只加载屏幕和内存可以处理的内容。标准 类 都是基于内存的,所以你会很早就达到内存限制。但是有 OpenNetCF 能够仅使用文件流 'scale' 动态图像。

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

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