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;
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM