在 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);
    }
}