如何转换type' system.windows.media.imagesource'到' system.drawing.image'或C#中的byte []?

时间:2012-08-13 10:21:34

标签: c# .net wcf silverlight dicom

我正在做一个项目,其中DICOM的内置类给我ImageSource,我想在我的silverlight ImageSource控件中使用Image。这是我通过WCF服务进行的转换。我发现WCF不支持ImageSource,所以我需要将内置类的输出转换为Image或者在byte []中。因此,我可以将该输出发送到Silverlight,在Silverlight客户端中,我将它重新转换为ImageSource,并可以轻松地将其分配给Image Control。

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

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

更新: - 简要描述;简介: 我有一个课程,请说GetImageSource,我有一个方法说giveImgSource()。现在我的问题是: 在WCF中,我必须调用此方法,在从此方法获取ImageSource后,我需要将其传递给我的silverlight客户端。由于WCF不知道ImageSource,所以如果您知道,我需要将此方法的输出转换为以下中的某个或任何替代方法:

byte[]
Image
FileStream
MemoryStream etc

3 个答案:

答案 0 :(得分:3)

是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();
}

更新: 解码:

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;

答案 1 :(得分:1)

请参阅以下链接,将ImageSource转换为byte []。它们使用在PresentationCore库下可用的BitmapSource和WriteableBitmap类。

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

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

希望它能解决你的问题。

答案 2 :(得分: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;
}