在metro / windows 8 .NET 4.5中将图像转换为字符串(base64)

时间:2012-07-24 18:35:33

标签: c# image windows-8 microsoft-metro

我需要将一张图片(存储在Image类型的对象中)转换为一个字符串进行存储(以后转换回用于显示的Image对象)

我在.NET 4.0等中找到了很多将图像转换为base64字符串的答案,但在4.5中没有System.Windows.Bitmap命名空间(Image类在Windows.UI.Xaml.Media中。成像)以及在4.0“Save()”中使其成为可能的命名空间中的方法似乎不在4.5中......除非我找不到它。

这是一个做这个here的例子,但就像我说它在Metro app / .NET 4.5中不起作用

任何想法?

更多细节: 执行此操作的方法将转换包含图像对象的实例字段(香港专业教育学院使用其源属性,这是正确的吗?)并且需要将转换中的结果字符串存储在实例字符串字段中。然后可以序列化整个对象,忽略Image字段,希望稍后反序列化并将字符串恢复到Image字段以供显示。到目前为止,我已经尝试使用DataContractSerializer来序列化图像中的字符串,但它似乎并不喜欢它。一旦我从图像中得到一个字符串,我就可以将其序列化,但这不是我以前做过的事情。

此外,似乎唯一正确的.net 4.5文档是这里的页面:http://msdn.microsoft.com/library/windows/apps/

在.net 4.5的“正常外观”msdn网站上的页面似乎并不总是在Metro应用程序中工作? (只是一个理论?)

[解决]

我终于明白了!对于其他任何必须这样做的人,答案就在这里:http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/38c6cb85-7454-424f-ae94-32782c036567/

我做了这个

var reader = new DataReader(myMemoryStream.GetInputStreamAt(0));
var bytes  = new byte[myMemoryStream.Size];
await reader.LoadAsync((uint)myMemoryStream.Size);
reader.ReadBytes(bytes);

在此序列之后,字节数组bytes将包含来自其中的流的数据,从那里我将字符串设置为值

Convert.ToBase64String(bytes);

4 个答案:

答案 0 :(得分:2)

我终于明白了!对于其他任何必须这样做的人,答案就在这里:http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/38c6cb85-7454-424f-ae94-32782c036567/

我做了这个

var reader = new DataReader(myMemoryStream.GetInputStreamAt(0));
var bytes  = new byte[myMemoryStream.Size];
await reader.LoadAsync((uint)myMemoryStream.Size);
reader.ReadBytes(bytes);

在此序列之后,字节数组字节将包含来自其中的流的数据,从那里我将字符串设置为值

Convert.ToBase64String(bytes);

答案 1 :(得分:1)

我不确定这是因为我没有在这里安装.net 4.5,但我认为这可行:

您可以使用BitmapSource.CopyPixels()方法提取图像的像素:

http://msdn.microsoft.com/en-us/library/ms616043(v=vs.110).aspx

然后使用Convert.ToBase64String()进行转换。

此外,这里有一些有用的成像技巧:

http://msdn.microsoft.com/en-us/library/ms750864(v=vs.110

答案 2 :(得分:0)

试试BitmapEncoderExample of how to create a BitmapEncoder here。适当的名称空间为Windows.Graphics.Imaging

BitmapEncoder为您提供编码器。然后,您可以使用GetPixelDataAsync(BitmapPixelFormat, BitmapAlphaMode, BitmapTransform, ExifOrientationMode, ColorManagementMode)获取像素数据。接下来,您可以使用任何通用的C#base64编码器。

(例子是Javascript,但也应该适用于C#,因为类存在于C#中)

答案 3 :(得分:0)

您应该存储图像(例如JPEG)格式的编码格式,解码回byte [],创建MemoryStream,然后可以从流中创建Metro BitmapImage。