WPF 图片DPI和不释放问题

372次阅读
没有评论

共计 1514 个字符,预计需要花费 4 分钟才能阅读完成。

最近项目中遇到的问题

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

而且还同时遇到了图片的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;
    }
}

正文完
 0
flames
版权声明:本站原创文章,由 flames 于2021-01-18发表,共计1514字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)