zoukankan      html  css  js  c++  java
  • 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;
        }
    }
    
  • 相关阅读:
    epoll的LT和ET(转)
    js和jQuery的互相转换
    Spring的回滚问题
    Spring的事务
    分布式锁的实现方式
    xml是什么
    ajax的4个字母分别是什么意思
    try、catch、finally都有return语句时执行哪个
    静态变量、实例变量、局部变量线程安全吗,为什么
    String和StringBuilder、StringBuffer的区别
  • 原文地址:https://www.cnblogs.com/flamegreat/p/14620616.html
Copyright © 2011-2022 走看看