在 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 转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章

WPF C# 图像源

C# WPF 错误 无法将类型"System.Windows.Media.ImageSource"转换为"System.Drawing.Bitmap"

WPF 中Image切换ImageSource做动画

在 C# 中将 WPF 属性绑定到 ApplicationSettings 的最佳方法?

WPF - 将位图转换为 ImageSource

如何在 c#,wpf 的 GridController 中将 ICollection 显示为一个字符串