代码之家  ›  专栏  ›  技术社区  ›  devguy

在WinMobile和.NET CF中调整和保存图像时抛出了MemoryException

  •  1
  • devguy  · 技术社区  · 15 年前

    我有一个winmobile应用程序,允许用户用相机拍摄照片,然后用于各种事情。照片可以在1600x1200、800x600或640x480处拍摄,但最长的尺寸必须调整到400px(当然另一个是成比例的)。代码如下:

    private void LoadImage(string path)
    {
        Image tmpPhoto = new Bitmap(path);
    
        // calculate new bitmap size...
        double width = ...
        double height = ...
    
       // draw new bitmap
       Image photo = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
       using (Graphics g = Graphics.FromImage(photo))
       {
           g.FillRectangle(new SolidBrush(Color.White), new Rectangle(0, 0, photo.Width, photo.Height));
           int srcX = (int)((double)(tmpPhoto.Width - width) / 2d);
           int srcY = (int)((double)(tmpPhoto.Height - height) / 2d);
           g.DrawImage(tmpPhoto, new Rectangle(0, 0, photo.Width, photo.Height), new Rectangle(srcX, srcY, photo.Width, photo.Height), GraphicsUnit.Pixel);
       }
       tmpPhoto.Dispose();
       // save new image and dispose
       photo.Save(Path.Combine(config.TempPath, config.TempPhotoFileName), System.Drawing.Imaging.ImageFormat.Jpeg);
       photo.Dispose();
    }
    

    现在的问题是应用程序在照片中中断。保存调用,但出现OutOfMemoryException。我也不知道为什么,因为我会尽快处理tempphoto(和相机里的原始照片一起),我也会处理图形obj。为什么会这样?在我看来,不可能用相机拍摄照片并调整大小/保存它而不让它崩溃:(我是否应该为这样一个简单的事情重新安排C++?) 谢谢。

    1 回复  |  直到 15 年前
        1
  •  0
  •   ctacke    15 年前

    你有没有观察每一步的内存使用情况,以确定你使用最多的是哪一步?您忽略了宽度和高度的计算,但假设它们是正确的,那么最终的结果是位图数据本身需要400x300x3(24位)==360k,而位图数据本身并不是非常大。

    我的猜测是,即使你调用dispose,资源也不会被占用, 尤其地 如果您多次调用此方法。cf在位图中的行为出乎意料。 I call it a bug 是的。 The CF team doesn't 是的。