【问题标题】:Convert image to string (base64) in metro/windows 8 .NET 4.5在 Metro/Windows 8 .NET 4.5 中将图像转换为字符串(base64)
【发布时间】:2012-07-23 03:25:29
【问题描述】:

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

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

有一个这样做的例子here 但就像我说的那样它在 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);

【问题讨论】:

  • 您可能会使用 WriteableBitmapExtensions 将图像转换为字节数组,然后您可以将其转换为 base64 编码字符串:writeablebitmapex.codeplex.com 他们支持 Windows 8 Metro,但我没有使用过它在 Metro,所以我不会将此作为答案发布。
  • 就是这样。这是技巧,我会将这个问题标记为最喜欢的,因为我将来肯定会需要这个。

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


【解决方案1】:

我终于明白了!对于其他必须这样做的人,答案在这里: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);

【讨论】:

  • 它只是将图像转换为base64,但是如何将base64string转换为BitmapImage或WritebleBitmapImage?
  • 要将字符串反向转换为字节,将字节写入内存流并将BitmapImage的源设置为流
  • BitmapImage 获取源 RandomAccessMemory 在将 memoryStream 对象转换为 RandomAccess ms.AsRandomAccess() 时出现错误
  • 但我使用 InMemoryRandomAccessStream 和 DataWriter 类完成了这项工作。谢谢:)
  • 是的,我就是这样做的: var ims = new InMemoryRandomAccessStream(); var bytes = Convert.FromBase64String(imageString); var dataWriter = new DataWriter(ims); dataWriter.WriteBytes(字节); dataWriter.StoreAsync(); ims.Seek(0); BitmapImage img = new BitmapImage(); img.SetSource(ims);返回图片;
【解决方案2】:

我不确定这一点,因为我没有在此处安装 .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)

【讨论】:

  • 您应该链接到 4.5 版本而不是 4.0 版本:msdn.microsoft.com/en-us/library/ms616043(v=vs.110).aspx
  • 谢谢!我试过这个,我发现尽管文档说 VS 不会接受定义 CopyPixels 的 Media.Imaging 命名空间,并且 Intellisense 不显示 BitmapImage 或 BitmapSource 的 CopyPixels -_- 如果我导入了PresentationCore.dll 这个方法是在哪里定义的?我以前从来没有做过这种事情,所以我不知道它是否可以工作
  • 我相信我取得了一些进展,我能够将图像数据放入流中(IRandomAccessStream)然后我完成了 byte[] array = (stream as MemoryStream).ToArray();但是这会引发 NullReferenceException?之后我相信我可以做 string base64string = System.Convert.ToBase64String(byteArray);但目前例外是阻止这一步
【解决方案3】:

试试BitmapEncoderExample of how to create a BitmapEncoder here。合适的命名空间是Windows.Graphics.Imaging

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

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

【讨论】:

  • 谢谢!我已经尝试过了,虽然它可能有效,但我无法弄清楚如何使用编码器类!我一直在尝试不在代码中引用实际文件,因为图像文件可能并不总是图像的来源(相机可能会被用来拍摄它,然后该值存储在图像中对象代替)所以我没有让事情变得更容易。如果找不到其他方法,我可能会再次使用它。
  • 您可以从流中创建位图编码器。您应该能够将其与@Feng Yuan 的回答结合起来,以拥有一个有效的BitmapEncoder
  • 我明白了,老实说它仍然有点令人困惑,但我认为我更接近答案。我现在已经在 IRandomAccessStream 中获得了图像,该图像是从所选择的文件中设置的。我现在怎样才能把这个流的内容变成我想要的形式?
  • BitmapEncoder 类有一个构造函数 CreateAsync(Guid, IRandomAccessStream) 进行此操作,然后使用 GetPixelDataAsync 方法检索像素。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2018-09-07
    • 2014-07-21
    • 2019-04-07
    • 2013-07-04
    • 2016-08-30
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多