45 lines
1.5 KiB
C#
45 lines
1.5 KiB
C#
|
|
using System.IO;
|
|||
|
|
using System.Windows.Media.Imaging;
|
|||
|
|
|
|||
|
|
namespace SHH.CameraDashboard;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// [UI层] 图像数据转换助手
|
|||
|
|
/// 职责:将内存中的二进制 JPEG 数据高效转换为 WPF 可用的 BitmapImage
|
|||
|
|
/// 优化:使用 OnLoad 缓存策略和 Freeze 冻结对象,支持跨线程访问,防止内存泄漏
|
|||
|
|
/// </summary>
|
|||
|
|
public static class BitmapHelper
|
|||
|
|
{
|
|||
|
|
public static BitmapImage? ToBitmapImage(byte[] blob)
|
|||
|
|
{
|
|||
|
|
if (blob == null || blob.Length == 0) return null;
|
|||
|
|
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
using (var stream = new MemoryStream(blob))
|
|||
|
|
{
|
|||
|
|
var bitmap = new BitmapImage();
|
|||
|
|
bitmap.BeginInit();
|
|||
|
|
|
|||
|
|
// 关键优化 1: 立即加载流到内存,允许 stream 在方法结束后被释放
|
|||
|
|
bitmap.CacheOption = BitmapCacheOption.OnLoad;
|
|||
|
|
bitmap.StreamSource = stream;
|
|||
|
|
|
|||
|
|
// 关键优化 2: 忽略内嵌的色彩配置和缩略图,提升解码速度
|
|||
|
|
bitmap.CreateOptions = BitmapCreateOptions.IgnoreColorProfile | BitmapCreateOptions.IgnoreImageCache;
|
|||
|
|
|
|||
|
|
bitmap.EndInit();
|
|||
|
|
|
|||
|
|
// 关键优化 3: 冻结对象,使其变得线程安全(可以跨线程传递给 UI)
|
|||
|
|
bitmap.Freeze();
|
|||
|
|
|
|||
|
|
return bitmap;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
// 解码失败(可能是坏帧),返回 null 忽略该帧
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|