2010-09-23 41 views
4

我有一个是通过打开文件对话框像填充动态创建的Image控件:如何从Image.Source获取Memory Stream/Base64字符串?

OpenFileDialog dialog = new OpenFileDialog(); 
if (dialog.ShowDialog() == true) 
{ 
    using (FileStream stream = dialog.File.OpenRead()) 
    {      
     BitmapImage bmp = new BitmapImage(); 
     bmp.SetSource(stream); 
     myImage.Source = bmp; 
    } 
} 

我想通过Web服务将图像发送回服务器在一个单独的函数调用,如字符串。

我如何从myImage.Source内存流/字符串的base64

回答

10

这里是一个应该工作的替代方案(没有BmpBitmapEncoder)。它使用FileStream流创建字节数组,然后将其转换为Base64字符串。这假定你想在当前代码的范围内做到这一点。

Byte[] bytes = new Byte[stream.Length]; 
    stream.Read(bytes, 0, bytes.Length); 
    return Convert.ToBase64String(bytes); 
+0

我想你的意思是stream.read(),其中stream是FileStream,而不是mem.write()。但是,这是没有使用额外的DLL的作品。 – 2010-09-23 13:28:24

+0

不需要内存流。我做了:Byte [] bytes = new Byte [stream.Length]; stream.Read(bytes,0,bytes.Length); serialized = Convert.ToBase64String(bytes); – 2010-09-23 13:49:53

+0

啊是的好点,我会更新。 – TheCodeKing 2010-09-23 14:04:58

3

请确保您有http://imagetools.codeplex.com/

然后,你可以这样做:

ImageSource myStartImage; 

var image = ((WriteableBitmap) myStartImage).ToImage(); 
var encoder = new PngEncoder(false); 

MemoryStream stream = new MemoryStream(); 
encoder.Encode(image, stream); 

var myStartImageByteStream = stream.GetBuffer(); 

然后为Base64编码:

string encodedData = Convert.ToBase64String(myStartImageByteStream); 
+0

+1不错的答案,但我认为Base64位可能是红鲱鱼,将流直接抽到服务器会更好。 – AnthonyWJones 2010-09-23 10:17:25

+0

这看起来很有前景,并且DLL的体积也非常小。谢谢你现在就试试 – 2010-09-23 11:46:16

+0

AnthonyWJones-你可以做一个Windows应用程序,但我认为Silverlight不支持流式WCF调用。 – 2010-09-23 12:34:33