C# 将 BitmapSource 转换为 BitmapImage

C# Converting BitmapSource to BitmapImage

我正在尝试编写一个将 BitmapSource 转换为 BitmapImage 的函数。我能找到的唯一方法是创建一个临时 bmp 文件写入和读取文件以创建一个新的 BitmapImage。在您尝试删除文件或重新使用该功能之前,这一切正常。存在一些文件处理错误,文件在释放 BitmapImage 之前仍将被使用。

1 - 是否有更好的方法将 BitmapSource 转换为 BitmapImages?

2 - 我可以在不释放 BitmapImage 的情况下对 return 做什么?

public BitmapImage ConvertSourceToBitMapImage(BitmapSource bitmapSource)
{
    BitmapImage bmi = null;
    try
    {
        string filePath = @"C:\GitRepository\ReceiptAPP\ReceiptApplication\bin\Debug\testing.bmp";
        using (var fileStream = new FileStream(filePath, FileMode.Create))
        {
            BitmapEncoder encoder = new BmpBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(bitmapSource));
            encoder.Save(fileStream);
            fileStream.Close();
        }
        Uri path = new Uri(filePath);
        bmi = new BitmapImage(path);
        File.Delete(filePath);
    }
    catch(Exception ex)
    {
    }
    return bmi;
}

从 MemoryStream 编码和解码比文件高效得多。

但是请注意,没有从 BitmapSource 到 BitmapImage 的转换用例。 BitmapSource 可以直接用作 Image 元素的 Source 或 ImageBrush 的 ImageSource。您从不明确需要 BitmapImage。

public static BitmapImage ConvertBitmapSourceToBitmapImage(
    BitmapSource bitmapSource)
{
    // before encoding/decoding, check if bitmapSource is already a BitmapImage

    if (!(bitmapSource is BitmapImage bitmapImage))
    {
        bitmapImage = new BitmapImage();

        BmpBitmapEncoder encoder = new BmpBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(bitmapSource));

        using (MemoryStream memoryStream = new MemoryStream())
        {
            encoder.Save(memoryStream);
            memoryStream.Position = 0;

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

    return bitmapImage;
}