Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在metro/windows 8.NET 4.5中将图像转换为字符串(base64)_C#_Image_Windows 8_Microsoft Metro - Fatal编程技术网

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

C# 在metro/windows 8.NET 4.5中将图像转换为字符串(base64),c#,image,windows-8,microsoft-metro,C#,Image,Windows 8,Microsoft Metro,我需要在metro应用程序中将图片(存储在Image类型的对象中)转换为字符串进行存储(稍后再转换回图像对象进行显示) 我在.NET 4.0等中找到了很多关于将图像转换为base64字符串的答案,但在4.5中,System.Windows.Bitmap命名空间不存在(image类位于Windows.UI.Xaml.Media.Imaging中),而该命名空间中使4.0“Save()”成为可能的方法似乎不在4.5中,除非我找不到它 有一个这样做的例子,但就像我说的,它在metro app/.NET

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

我在.NET 4.0等中找到了很多关于将图像转换为base64字符串的答案,但在4.5中,System.Windows.Bitmap命名空间不存在(image类位于Windows.UI.Xaml.Media.Imaging中),而该命名空间中使4.0“Save()”成为可能的方法似乎不在4.5中,除非我找不到它

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

有什么想法吗

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

此外,似乎唯一绝对正确的.net 4.5文档是以下页面:

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

[已解决]


我终于明白了!对于任何不得不这样做的人,答案如下:

是我干的

var reader = new DataReader(myMemoryStream.GetInputStreamAt(0));
var bytes  = new byte[myMemoryStream.Size];
await reader.LoadAsync((uint)myMemoryStream.Size);
reader.ReadBytes(bytes);
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);
Convert.ToBase64String(bytes);
试试。合适的名称空间是
Windows.Graphics.Imaging

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


(示例是Javascript,但也适用于C#,因为类存在于C#)

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

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

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

此外,以下是一些有用的成像方法:


)

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

我终于得到了它!对于任何不得不这样做的人,答案如下:

是我干的

var reader = new DataReader(myMemoryStream.GetInputStreamAt(0));
var bytes  = new byte[myMemoryStream.Size];
await reader.LoadAsync((uint)myMemoryStream.Size);
reader.ReadBytes(bytes);
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);
Convert.ToBase64String(bytes);

您可能可以使用WriteableBitmapExtensions将图像转换为字节数组,然后将其转换为base64编码字符串:它们支持Windows 8 metro,但我没有在metro中使用它,因此我不会将此作为答案发布。仅此而已。这是一个技巧,我将把这个问题标记为fav,因为我将来肯定会需要它。你应该链接到4.5版本而不是4.0版本:谢谢!我尝试了这个方法,我发现不管文档怎么说,VS都不会接受媒体。定义了CopyPixels的Imaging命名空间,Intellisense不会为BitmapImage或BitmapSource显示CopyPixels-\如果我导入了定义此方法的PresentationCore.dll,这会起作用吗?我以前从未做过这样的事情,所以我不知道它是否能工作。我相信我取得了一点进步,我能够将图像数据放入一个流(irandomaccesstream),然后我做了byte[]array=(作为MemoryStream的流)。ToArray();但是,这会引发NullReferenceException吗?在那之后,我相信我可以做stringbase64string=System.Convert.ToBase64String(byteArray);但是例外情况正在阻止此步骤谢谢!我已经试过了,虽然它可能会起作用,但我不知道如何使用编码器类!我一直试图在代码中不引用实际的文件,因为图像的文件可能并不总是图像的源(相机可能会在那里拍摄,而该值存储在图像对象中),所以我没有让事情变得更简单。如果找不到其他方法,我可能会再次使用它。您可以从流创建位图编码器。你应该能够将其与@Feng Yuan的答案结合起来,得到一个工作的
BitmapEncoder
。我现在在一个irandomaccesstream中得到了这个图像,它是从正在拾取的文件中设置的。现在如何将此流的内容转换为所需的格式?
BitmapEncoder
类具有构造函数
CreateAsync(Guid,irandomaccesstream)
这样做,然后使用
GetPixelDataAsync
方法检索像素。这只是将图像转换为base64,但如何将base64string转换为BitmapImage或WritebleBitmapImage?将字符串向后转换为字节,将字节写入内存流,并将BitmapImage的源设置为streamBitmapImage take source RandomAccessMemory在将memoryStream对象转换为RandomAccess时出错ms.AsRandomAccess(),但我已使用InMemoryRandomAccessStream和DataWriter类完成了此操作。谢谢:)是的,我就是这样做的:var ims=new InMemoryRandomAccessStream();var bytes=Convert.FromBase64String(imageString);var dataWriter=新的dataWriter(ims);dataWriter.WriteBytes(字节);dataWriter.StoreAsync();