使用位图时无法解决已知的内存泄漏问题

时间:2014-09-12 09:42:52

标签: c# wpf memory bitmap gdi+

**

  

DUPLICATE解决了问题

**

我现在已经抓了谷歌一段时间了,我找到了一些答案,但我无法使其发挥作用 我读到在加载/替换位图时.NET中存在内存泄漏。该框架不是autom。从旧位图释放内存。由于"内部,GC无法收集旧的位图?"引用不是autom。由框架删除。

一切正常,所以你真的不必阅读所有代码 我只是不明白在哪里释放那些烦人的记忆。

非常欢迎任何帮助。提前谢谢。

我的所作所为:

imageTif.Source = _imageManager.getBitmapSource();

public BitmapSource getBitmapSource(){
   //Create Bitmap from Tif
   //Create **NEW** BitmapSource using HBitmap
   //returning BitmapSource
}

这是我创建位图的方法:

    private Bitmap tiffToBitmap()
    {
        FieldValue[] imageHeight = _tif.GetField(TiffTag.IMAGELENGTH);
        int height = imageHeight[0].ToInt();

        FieldValue[] imageWidth = _tif.GetField(TiffTag.IMAGEWIDTH);
        int width = imageWidth[0].ToInt();

        FieldValue[] bitsPerSample = _tif.GetField(TiffTag.BITSPERSAMPLE);
        short bpp = bitsPerSample[0].ToShort();
        if (bpp != 1)
            return null;

        FieldValue[] samplesPerPixel = _tif.GetField(TiffTag.SAMPLESPERPIXEL);
        short spp = samplesPerPixel[0].ToShort();
        if (spp != 1)
            return null;

        FieldValue[] photoMetric = _tif.GetField(TiffTag.PHOTOMETRIC);
        Photometric photo = (Photometric)photoMetric[0].ToInt();
        if (photo != Photometric.MINISBLACK && photo != Photometric.MINISWHITE)
            return null;

        int stride = _tif.ScanlineSize();
        Bitmap result = new Bitmap(width, height, PixelFormat.Format1bppIndexed);

        // update bitmap palette according to Photometric value
        bool minIsWhite = (photo == Photometric.MINISWHITE);
        ColorPalette palette = result.Palette;
        palette.Entries[0] = (minIsWhite ? Color.White : Color.Black);
        palette.Entries[1] = (minIsWhite ? Color.Black : Color.White);
        result.Palette = palette;

        for (int i = 0; i < height; i++)
        {
            Rectangle imgRect = new Rectangle(0, i, width, 1);
            BitmapData imgData = result.LockBits(imgRect, ImageLockMode.WriteOnly, PixelFormat.Format1bppIndexed);

            byte[] buffer = new byte[stride];
            _tif.ReadScanline(buffer, i);

            Marshal.Copy(buffer, 0, imgData.Scan0, buffer.Length);
            result.UnlockBits(imgData);
        }

        return result;
    }

这是我使用HBitmap创建BitmapSource的方法:

private BitmapSource getBitmapSourceFromBitmap(Bitmap bitmap){
            return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                bitmap.GetHbitmap(),
                IntPtr.Zero,
                Int32Rect.Empty,
                BitmapSizeOptions.FromEmptyOptions());
        }

0 个答案:

没有答案