2012-08-13 173 views
1

我正在做一个DICOM给我的ImageSource的内置类的项目,我想用这个ImageSource控制我的silverlight Image。我正在通过WCF服务进行这种转换。我发现WCF不支持ImageSource,所以我需要将内置类的输出转换为Image,否则转换为byte []。为了能够将该输出发送到Silverlight,并在Silverlight客户端中,我将它重新转换为ImageSource并可以轻松地将其分配给Image Control。如何在C#中将'system.windows.media.imagesource'类型转换为'system.drawing.image'或byte []?

我为此搜索了一下,但是在那里我没有找到任何帮助。任何人都可以帮助我解决这个问题,或者为我提供任何替代解决方案。任何帮助将不胜感激,提前致谢。

注意: - 我没有任何内置类的代码修改权限。作为第三方图书馆。

更新: - 简要说明: 我有一个类让的说GetImageSource和我有一个方法说giveImgSource()。现在我的问题是: 在WCF中,我必须调用此方法,并从此方法获得ImageSource后,我需要将它传递给我的Silverlight客户端。由于WCF不知道ImageSource,所以我需要这个方法的输出转换成一些一出以下或任何替代,如果你知道:

byte[] 
Image 
FileStream 
MemoryStream etc 
+0

的可能的复制[?如何转换的ImageSource以字节数组(https://stackoverflow.com/questions/26814426/how -to-convert-images源到字节数组) – 2017-11-09 02:30:54

回答

2

它是一个PNG图像?然后用这个转换为byte []:

var image = (BitmapSource)value; 
BitmapEncoder encoder = new PngBitmapEncoder(); 
encoder.Frames.Add(BitmapFrame.Create(image)); 
using (var ms = new MemoryStream()) 
{ 
    encoder.Save(ms); 
    return ms.ToArray(); 
} 

UPDATE: 解码:

var bytes = (byte[])value; 

var image = new BitmapImage(); 
image.BeginInit(); 

if (bytes == null) 
{ 
    // Processing null case 
} 
else 
{ 
    using (var ms = new MemoryStream(bytes)) 
    { 
     image.CacheOption = BitmapCacheOption.OnLoad; 
     image.StreamSource = ms; 

     image.EndInit(); 
    } 
} 

return image; 
+0

感谢您的快速回复,但BitmapEncoder和BitmapFrame在WCf中不支持 – SharpUrBrain 2012-08-13 10:39:16

+0

在使用类似于Error1的代码之后,BitmapEncoder和BitmapSource会出现许多错误:类型为“系统”。 Windows.Freezable'在未引用的程序集中定义。您必须添加对程序集“WindowsBase,版本= 4.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35”的引用。 – SharpUrBrain 2012-08-13 12:45:39

+0

@SharpUrBrain:为什么你想在WCF库中使用这段代码?或者silverlight框架也不支持它呢? – dvvrd 2012-08-13 12:56:06

1

请参考以下链接转换的ImageSource为byte []。他们使用PresentationCore库下可用的BitmapSource和WriteableBitmap类。

(1)How to Convert ImageSource to byte[]?

(2)How to Convert ImageSource to byte[] and back to ImageSource?

希望它能够解决您的问题。

+0

BitmapSource,BitmapEncoder和BitmapFrame在PresentationCore.dll下可用。所以,在添加ref之后。到这个库中,你也可以尝试dvvrd成员建议的方法。 – DareToExplore 2012-08-13 12:18:47

+0

我尝试了上述链接,但没有运气。我在BitmapSource和编码器类中也遇到了几个错误,例如 错误1:类型'System.Windows.Freezable'在未引用的程序集中定义。您必须添加对程序集“WindowsBase,版本= 4.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35”的引用。 – SharpUrBrain 2012-08-13 12:47:40

+1

@DareToExplore; PresentationCore.dll是包含WPF实现的.NET框架程序集。问题中的目标框架是Silverlight,它与通常的.NET程序集不兼容 – dvvrd 2012-08-13 13:12:56

0

以下两个辅助方法应该能够做的伎俩:

public BitmapImage ImageFromBuffer(Byte[] bytes) 
{ 
    MemoryStream stream = new MemoryStream(bytes); 
    BitmapImage image = new BitmapImage(); 
    image.BeginInit(); 
    image.StreamSource = stream; 
    image.EndInit(); 
    return image; 
} 

public Byte[] BufferFromImage(BitmapImage imageSource) 
{ 
    Stream stream = imageSource.StreamSource; 
    Byte[] buffer = null; 
    if (stream != null && stream.Length > 0) 
    { 
     using (BinaryReader br = new BinaryReader(stream)) 
     { 
      buffer = br.ReadBytes((Int32)stream.Length); 
     } 
    } 

    return buffer; 
} 
相关问题