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;
}
我正在尝试编写一个将 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;
}