WPF 加载一张本地图片,并释放图片资源

最近项目中遇到的问题

直接指定控件显示本地图片后,图片会被我们自己的程序占用。
无法再做其他操作,也就是说图片控件不会释放图片资源。

而且还同时遇到了图片的DPI与屏幕不一样
导致的图片的属性里面写的代码和实际上显示到屏幕上的大小会不一致
我就直接先写死了图片的DPI为96,如果不需要可以去掉那部分代码

using System;
using System.Drawing;
using System.IO;
using System.Windows.Media.Imaging;

/// <summary>
/// 加载一张图片,但不会一直占用文件
/// </summary>
/// <param name="path">本地图片完整路径</param>
/// <returns></returns>
public static BitmapImage NewBitmapImage(string path)
{
    try
    {
        if (File.Exists(path))
        {
            BinaryReader binaryReader = new BinaryReader(File.Open(path, FileMode.Open));
            FileInfo fileInfo = new FileInfo(path);
            byte[] bytes = binaryReader.ReadBytes((int)fileInfo.Length);
            binaryReader.Close();

            #region 解决图片DPI问题(二选一即可)
            Bitmap bmTemp = new Bitmap(new MemoryStream(bytes));

            Bitmap bmNew = new Bitmap(bmTemp.Width, bmTemp.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

            bmNew.SetResolution(96, 96);

            using (Graphics g = Graphics.FromImage(bmNew))
            {
                g.Clear(System.Drawing.Color.Transparent);
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                g.DrawImage(bmTemp, new Rectangle(0, 0, bmNew.Width, bmNew.Height), 0, 0, bmTemp.Width, bmTemp.Height, GraphicsUnit.Pixel);
                g.Dispose();
            }

            BitmapImage bitmapImage = new BitmapImage();

            using (MemoryStream ms = new MemoryStream())
            {
                bmNew.Save(ms, System.Drawing.Imaging.ImageFormat.Png);

                bitmapImage.BeginInit();
                bitmapImage.StreamSource = ms;
                bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
                bitmapImage.EndInit();

                ms.Dispose();
            }
            #endregion

            #region 不管图片DPI问题(二选一即可)
            //bitmapImage.StreamSource = new MemoryStream(bytes); 
            #endregion

            return bitmapImage;
        }
        else
        {
            return null;
        }
    }
    catch (Exception)
    {
        return null;
    }
}

 

留下评论