在 C# WPF 中将 ImageSource 转换为字符串
Posted
技术标签:
【中文标题】在 C# WPF 中将 ImageSource 转换为字符串【英文标题】:Converting ImageSource to String on C# WPF 【发布时间】:2022-01-20 00:37:11 【问题描述】:ESRI 符号库速度很慢,有时需要比预期更长的时间。
我希望将选定范围的 ImageSource 序列化到缓存、内存或文件中的字符串。
我在网上搜索过,但在 ImageSource 上搜索的不多。
我发现一个有趣的东西是“ImageSourceValueSerializer”。
作为 WPF 中 3 个月大的婴儿,我不太确定如何解决这个问题。
这是我获得 ImageSource 的方式:
MultilayerPointSymbol multiLayerSym = await result.GetSymbolAsync() as MultilayerPointSymbol;
RuntimeImage swatch = await multiLayerSym.CreateSwatchAsync();
ImageSource symbolImage = await swatch.ToImageSourceAsync();
测试过克莱门的,套路:
MultilayerPointSymbol multiLayerSym = await result.GetSymbolAsync() as MultilayerPointSymbol;
RuntimeImage swatch = await multiLayerSym.CreateSwatchAsync();
ImageSource symbolImage = await swatch.ToImageSourceAsync();
byte[] b = ImageSourceBinary(symbolImage);
ImageSource test = BinaryImageSource(b);
在课堂上:
private byte[] ImageSourceBinary(ImageSource imageSrc)
if (imageSrc is BitmapSource bitmapSource)
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmapSource));
using (MemoryStream stream = new MemoryStream())
encoder.Save(stream);
return stream.ToArray();
return null;
private ImageSource BinaryImageSource(byte[] bytes)
using (MemoryStream stream = new MemoryStream(bytes))
PngBitmapDecoder decoder = new PngBitmapDecoder(stream, BitmapCreateOptions.IgnoreImageCache, BitmapCacheOption.Default);
BitmapFrame bf = decoder.Frames[0];
if (bf is ImageSource imagesource)
return imagesource;
return null;
结果,无图! :(
【问题讨论】:
我看不出这与字符串有什么关系。 【参考方案1】:检查 ImageSource 是否为 BitmapSource 并通过 BitmapEncoder 之一对 BitmapSource 进行编码。编码成 MemoryStream 或 FileStream。
private byte[] ImageSourceToByteArray(ImageSource imageSrc)
if (symbolImage is BitmapSource bitmapSource)
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmapSource));
using (var stream = new MemoryStream())
encoder.Save(stream);
return stream.ToArray();
return null;
为了从字节数组中解码图像,不要显式使用特定的 BitmapDecoder。更好地依赖自动解码器选择,如下所示。在解码后立即关闭流时设置BitmapCacheOption.OnLoad
也很重要。
private ImageSource ByteArrayToImageSource(byte[] bytes)
using (var stream = new MemoryStream(bytes))
return BitmapFrame.Create(
stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
【讨论】:
不太确定我是否正确解码。感谢您的帮助。 请查看编辑后的答案。 完美无瑕!谢谢朋友以上是关于在 C# WPF 中将 ImageSource 转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章
C# WPF 错误 无法将类型"System.Windows.Media.ImageSource"转换为"System.Drawing.Bitmap"