3

我需要将图片(存储在 Image 类型的对象中)转换为字符串以在 Metro 应用程序中存储(然后再转换回 Image 对象以进行显示)

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

这里有一个这样做的例子,但就像我说的那样,它在 Metro 应用程序/.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

4 回答 4

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);
于 2013-03-04T20:18:59.767 回答
1

我不确定这一点,因为我没有在这里安装 .net 4.5,但我认为这可以工作:

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

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

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

此外,这里有一些有用的成像 HOW-TO:

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

于 2012-07-24T18:55:24.600 回答
0

试试BitmapEncoder如何在此处创建 BitmapEncoder 的示例。适当的命名空间是Windows.Graphics.Imaging.

BitmapEncoder给你一个编码器。然后,您可以使用它GetPixelDataAsync(BitmapPixelFormat, BitmapAlphaMode, BitmapTransform, ExifOrientationMode, ColorManagementMode)来获取您的像素数据。之后,您可以使用任何通用 C# base64 编码器。

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

于 2012-07-24T18:53:03.243 回答
0

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

于 2012-07-24T20:22:02.670 回答