在循环中创建位图时出现内存溢出异常

时间:2011-07-08 00:20:03

标签: c# memory bitmap overflow imaging

我必须从许多图像中导入大量图像裁剪,这些图像都已准备好存储在我的数据库中。我每次尝试使用语句并处理我的位图对象。但是我仍然遇到内存溢出异常,我的系统内存不足。

以下是我正在做的一些示例代码。

public void CropImage(List<ImageClass> data)
{
    foreach (var obj in data)
    {
        //I have a data base method that returns a data object that 
        //contains the file bytes of the image id in data: 'file'
        //My List<ImageClass> data contains an ID of the original image
        //start x,y coords for the upper left corner of the rectangle,
        //and the width and height of the rectangle.

        Image img = Image.FromStream(new MemoryStream(file.Data));
        Bitmap bmp = new Bitmap((Bitmap)img);
        Rectangle cropArea = new Rectangle(obj.x_coordinate,
                                           obj.y_coordinate,
                                           obj.width,
                                           obj.height);

        Bitmap cropImage = bmp.Clone(cropArea, bmp.PixelFormat);

        SaveFile(cropImage, file, obj.scanID);

        img.Dispose();
        bmp.Dispose();
        cropImage.Dispose();
    }
}


    public void SaveFile(Bitmap cropImage, FileData file, int OCRscanID)
    {
        EncoderParameters encoderParams = new EncoderParameters();
        encoderParams.Param[0] = new EncoderParameter(
                                          System.Drawing.Imaging.Encoder.Quality,
                                          50L);

        ImageCodecInfo codecInfo = GetEncoderInfo("image/jpeg");
        MemoryStream newImage = new MemoryStream();
        cropImage.Save(newImage, codecInfo, encoderParams);

        byte[] newData = newImage.ToArray();

        //Saving data bytes to database of the cropped image 
    }

    private ImageCodecInfo GetEncoderInfo(string mimeType)
    {
        int j;
        ImageCodecInfo[] encoders;
        encoders = ImageCodecInfo.GetImageEncoders();
        for (j = 0; j < encoders.Length; ++j)
        {
            if (encoders[j].MimeType == mimeType)
                return encoders[j];
        }
        return null;
    }

我知道我可以修剪一些代码,例如搜索编码器来使用image / jpeg。但我有另一个应用程序,这个代码另一个项目。我似乎无法通过内存溢出。

我需要循环显示大约20k的图像。

3 个答案:

答案 0 :(得分:5)

你没有处理你的记忆流。应该处理实施IDisposable的所有内容。

Is a memory leak created if a MemoryStream in .NET is not closed?

答案 1 :(得分:1)

Ants memory profiler是调试这些类型问题的宝贵工具。乍一看,我看到的唯一问题是,如果您抛出异常,就会发生泄漏。

我要做的是使用using而不是手动处理对象并确保记录异常。如果没有这样做并且内存分析器没有向您显示任何问题,请尝试添加GC.collect(),因为如果您的大型对象堆碎片化,这可能会有所帮助,这对于这种代码来说相对可能。 / p>

答案 2 :(得分:0)

有一些可供选择的选项可能会有所帮助 位图压缩,位图回收,位图缩放,捕获位图。

捕获位图

Catching OutOfMemoryError in decoding Bitmap

回收位图

Android: Bitmap recycle() how does it work?

位图压缩

How to make Bitmap compress without change the bitmap size?

位图缩放

Android - Scale and compress a bitmap