【问题标题】:Serializing Object containing BitmapImage序列化包含 BitmapImage 的对象
【发布时间】:2013-08-27 07:35:45
【问题描述】:

这是关于这个主题的另一个问题:How to use deserialized object?我的类中有一些变量有问题,现在我只是把[XmlIgnore]放在无法序列化的变量前面,所以类的序列化有效暂时。

我的班级是这样的:

public class Channel : INotifyPropertyChanged
{
    public int Width { get; set; }
    public int Height { get; set; }
    [XmlIgnore]
    public BitmapImage Logo { get; set; }
    public string CurrentCoverURL { get; set; }
    [XmlIgnore]
    public SolidColorBrush Background { get; set; }
    private string name;
    public string Name
    {
        get { return name; }
        set
        {
            name = value;
            NotifyPropertyChanged("Name");
        }
    }
}

现在我还需要序列化 ​​Bitmapimage 和 SolidColorBrush,这样我就可以将这些信息传递给我的下一个视图。

我找到了一种方法 (Serialize a Bitmap in C#/.NET to XML),但这不适用于 Windows 8 应用程序。 System.Drawing.Bitmap 在 Windows 8 中不可用。

有人可以帮我解决这个问题吗?

谢谢!

【问题讨论】:

    标签: c# serialization windows-8 bitmap xml-serialization


    【解决方案1】:

    这帮助我做同样的事情。只需先转换为字节数组即可。

    http://jamessdixon.wordpress.com/2013/10/01/handling-images-in-webapi/

    您可以像这样在 JSON 负载中包含您的图像:

    public class Person
    {
        public Int32 PersonId { get; set; }
        public String FirstName { get; set; }
        public byte[] Image { get; set; }
    }
    

    或者您可以像这样在 JSON 有效负载中包含 imageUri:

    public class Person
    {
        public Int32 PersonId { get; set; }
        public String FirstName { get; set; }
        public String ImageUri { get; set; }
    }
    

    您可以像这样将您的位图图像转换为字节数组;

    public static byte[] ConvertToBytes(BitmapImage bitmapImage)
    {
        using (var ms = new MemoryStream())
        {
            var btmMap = new WriteableBitmap
                (bitmapImage.PixelWidth, bitmapImage.PixelHeight);
    
            // write an image into the stream
            btmMap.SaveJpeg(ms, bitmapImage.PixelWidth, bitmapImage.PixelHeight, 0, 100);
    
            return ms.ToArray();
        }
    }
    

    【讨论】:

    • 这里不鼓励仅包含链接的答案。从长远来看,链接会发生变化,然后您的答案将毫无用处。请考虑扩展您的答案以包含一些具体示例。
    • 您确定此代码有效吗?通过阅读它,bitmapImage 中的数据实际上并没有被读取。仅查询其尺寸以创建具有匹配大小的新 WriteableBitmap,然后将刚刚创建的 WriteableBitmap 保存到字节数组中,但您实际上从未读取 bitmapImage 中的数据。
    • 另外,WriteableBitmap 没有 SaveJpeg 方法。您是否可能在添加它的代码中引用了扩展方法?如果是这样,您也应该包含该代码。但同样,上面的代码似乎一开始就不起作用,因为实际上没有任何内容读取 bitmapImage
    【解决方案2】:

    最好的办法是停止序列化实现(例如BitmapImageSolidColorBrush 等),开始序列化数据。例如,如果您要传输 jpg、gif 等图像:byte[] 效果非常好,并且大多数序列化程序都能理解。如果你想序列化一种颜色 - 那么你有多种选择:

    • 一个枚举
    • RGBA 值(可以是intstring

    等等。这几乎可以在任何序列化程序和平台上正常工作。然后,您只需以适合您目标平台的相关方式处理该数据。

    【讨论】:

      【解决方案3】:

      “我找到了一种方法(将 C#/.NET 中的位图序列化为 XML),但这不适用于 Windows 8 应用程序。System.Drawing.Bitmap 在 Windows 8 中不可用。 "

      您可以使用 BitmapImage.StreamSource 将其保存/复制到 MemoryStream 并将其转换为字节数组

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-01
        • 2014-07-10
        • 1970-01-01
        • 1970-01-01
        • 2011-12-02
        • 2015-10-02
        • 2017-01-24
        相关资源
        最近更新 更多