在 C# WPF 中将 ImageSource 转换为字符串
Converting ImageSource to String on C# WPF
ESRI 符号库运行缓慢,有时花费的时间比预期的要长。
我希望将选定范围的 ImageSource 序列化到内存或文件中的缓存、字符串。
我在网上搜索过,但在 ImageSource 上搜索得不多。
我发现的一个有趣的东西是“ImageSourceValueSerializer”。
作为 WPF 中 3 个月大的婴儿,我不太确定该怎么做。
这是我获取 ImageSource 的方式:
MultilayerPointSymbol multiLayerSym = await result.GetSymbolAsync() as MultilayerPointSymbol;
RuntimeImage swatch = await multiLayerSym.CreateSwatchAsync();
ImageSource symbolImage = await swatch.ToImageSourceAsync();
测试了Clemen's,例程:
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);
在class中:
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;
}
}
结局,无图! :(
检查 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);
}
}
ESRI 符号库运行缓慢,有时花费的时间比预期的要长。
我希望将选定范围的 ImageSource 序列化到内存或文件中的缓存、字符串。
我在网上搜索过,但在 ImageSource 上搜索得不多。
我发现的一个有趣的东西是“ImageSourceValueSerializer”。
作为 WPF 中 3 个月大的婴儿,我不太确定该怎么做。
这是我获取 ImageSource 的方式:
MultilayerPointSymbol multiLayerSym = await result.GetSymbolAsync() as MultilayerPointSymbol;
RuntimeImage swatch = await multiLayerSym.CreateSwatchAsync();
ImageSource symbolImage = await swatch.ToImageSourceAsync();
测试了Clemen's,例程:
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);
在class中:
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;
}
}
结局,无图! :(
检查 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);
}
}