WPFヘルパー:ImageHelper.cs – BitmapSource関連「画像ファイル読み込み・DPI96化・拡張子判定」

コンピュータ

Helpers/ImageHelper.cs

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

namespace Maywork.WPF.Helpers;

public static partial class ImageHelper
{
    // 画像ファイルを読み込むメソッド
    public static BitmapSource Load(string path)
    {
        using var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);

        var decoder = BitmapDecoder.Create(
            stream,
            BitmapCreateOptions.PreservePixelFormat,
            BitmapCacheOption.OnLoad);

        var frame = decoder.Frames[0];
        frame.Freeze();

        return frame;
    }

    // 96DPIに変換する
    public static BitmapSource To96Dpi(BitmapSource source)
    {
        if (Math.Abs(source.DpiX - 96) < 0.01 &&
            Math.Abs(source.DpiY - 96) < 0.01)
            return source;

        var bmp = new RenderTargetBitmap(
            source.PixelWidth,
            source.PixelHeight,
            96,
            96,
            PixelFormats.Pbgra32);

        var dv = new DrawingVisual();
        using (var dc = dv.RenderOpen())
        {
            dc.DrawImage(source,
                new Rect(0, 0, source.PixelWidth, source.PixelHeight));
        }

        bmp.Render(dv);
        bmp.Freeze();

        return bmp;
    }

    // Imageコントロール対応拡張子判定
    private static readonly HashSet<string> _supportedExtensions =
        new(StringComparer.OrdinalIgnoreCase)
        {
            ".jpg",
            ".jpeg",
            ".png",
            ".bmp",
            ".gif",
            ".tif",
            ".tiff",
            ".webp"
        };

    /// <summary>
    /// 画像として扱う拡張子か判定する
    /// </summary>
    public static bool IsSupportedImage(string path)
    {
        if (string.IsNullOrWhiteSpace(path))
            return false;

        var ext = Path.GetExtension(path);

        if (string.IsNullOrEmpty(ext))
            return false;

        return _supportedExtensions.Contains(ext);
    }
}

/*
 // 使用例

LoadCommand = new RelayCommand(async _ =>
{
    var path = @"C:\temp\test.jpg";

    if (!ImageHelper.IsSupportedImage(path))
        return;

    var bmp = await Task.Run(() =>
    {
        var img = ImageHelper.Load(path);
        return ImageHelper.To96Dpi(img);
    });

    Image = bmp;
});
 */
Download

コメント