序列化包含 BitmapImage 的对象

3
这是关于这个主题的进一步问题:如何使用反序列化对象? 我在我的类中遇到了一些变量的问题,现在我只是在不能被序列化的变量前面加上 [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应用程序不起作用。在Windows 8中不可用System.Drawing.Bitmap。请问有人能帮我解决这个问题吗?谢谢!
3个回答

3
这帮助我做相同的事情。只需先转换为字节数组即可。 您可以像这样在JSON有效负载中包含图像:http://jamessdixon.wordpress.com/2013/10/01/handling-images-in-webapi/
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();
    }
}

1
这里不鼓励仅包含链接的答案。长期来看,链接会发生变化,那么你的答案就会变得无用。请考虑扩展你的答案,包括一些具体的例子。 - joran
你确定这段代码能正常工作吗?从代码中看,bitmapImage 中的数据似乎并没有被读取。只有它的尺寸被查询以创建一个新的 WriteableBitmap,然后你将刚刚创建的 WriteableBitmap 保存到一个字节数组中,但实际上你并没有读取 bitmapImage 中的数据。 - Mark A. Donohoe
此外,“WriteableBitmap”没有“SaveJpeg”方法。你可能在代码中引用了一个添加了它的扩展方法吗?如果是这样,你应该一并包含该代码。但是,在上面的代码中似乎根本没有东西读取“bitmapImage”,因此它可能根本无法运行。 - Mark A. Donohoe

0

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

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

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


0

"我找到了一种方法来实现这个(在C#/.NET中将位图序列化为XML),但是这对于Windows 8应用程序无效。System.Drawing.Bitmap在Windows 8中不可用。"

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接