C# 如何将类型“system.windows.media.imagesource”转换为“system.drawing.image”或C中的字节[]?

C# 如何将类型“system.windows.media.imagesource”转换为“system.drawing.image”或C中的字节[]?,c#,.net,wcf,silverlight,C#,.net,Wcf,Silverlight,我正在做一个项目,其中DICOM的内置类提供了ImageSource,我想在silverlight图像控件中使用该ImageSource。我正在通过WCF服务进行此转换。我发现WCF不支持ImageSource,所以我需要将内置类的输出转换为Image或byte[]格式。所以我可以将输出发送到Silverlight,在Silverlight客户端中,我将把它重新转换为ImageSource,并可以轻松地将它分配给图像控制 我在谷歌上搜索了这个,但没有找到任何帮助。有谁能帮我解决这个问题,或者为我

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

我在谷歌上搜索了这个,但没有找到任何帮助。有谁能帮我解决这个问题,或者为我提供其他解决方案吗。任何帮助都将不胜感激,提前感谢

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

更新:- 简要说明: 我有一个类,比如说GetImageSource,还有一个方法,比如说giveImgSource。现在我的问题是: 在WCF中,我必须调用此方法,从该方法获取ImageSource后,我需要将其传递给silverlight客户端。由于WCF不知道ImageSource,因此我需要将此方法的输出转换为以下方法中的某一种或任何其他方法(如果您知道):

byte[]
Image
FileStream
MemoryStream etc

它是png图像吗?然后使用此命令将其转换为字节[]:

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;

它是png图像吗?然后使用此命令将其转换为字节[]:

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;

请参考以下链接,将ImageSource转换为字节[]。它们使用PresentationCore库中提供的BitmapSource和WriteableBitmap类

一,

二,


希望它能解决您的问题。

请参考以下链接,将ImageSource转换为字节[]。它们使用PresentationCore库中提供的BitmapSource和WriteableBitmap类

一,

二,


希望它能解决您的问题。

以下两种帮助器方法应该能够完成此任务:

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;
}

以下两个助手方法应该能够完成此任务:

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;
}


感谢您的快速回复,但WCFM中不支持BitmapEncoder和BitmapFrame。在使用诸如Error1之类的代码后,BitmapEncoder和BitmapSource会出现任何错误:类型“System.Windows.Freezable”是在未引用的程序集中定义的。您必须添加对程序集“WindowsBase,Version=4.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35”的引用。@SharpUrBrain:为什么要在WCF库中使用此代码?或者silverlight framework也不支持它?@SharpUrBrain:如果引用WindowsBase会发生什么情况?@SharpUrBrain:尝试引用所有需要的程序集谢谢您的快速回复,但是WCFM中不支持BitmapEncoder和BitmapFrame。在使用诸如Error1之类的代码后,BitmapEncoder和BitmapSource会出现任何错误:类型“System.Windows.Freezable”是在未引用的程序集中定义的。您必须添加对程序集“WindowsBase,Version=4.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35”的引用。@SharpUrBrain:为什么要在WCF库中使用此代码?或者silverlight framework也不支持它?@SharpUrBrain:如果引用WindowsBase会发生什么情况?@SharpUrBrain:尝试引用所有需要的程序集BitmapSource、BitmapEncoder和BitmapFrame在PresentationCore.dll下可用。所以,在向这个库添加ref.之后,你也可以尝试dvvrd成员建议的方法。我尝试了上面的链接,但没有成功。BitmapSource和Encoder类也出现了一些错误,如Error1:System.Windows.Freezable类型是在未引用的程序集中定义的。您必须添加对程序集“WindowsBase,版本=4.0.0.0,区域性=中性,PublicKeyToken=31bf3856ad364e35”的引用。@DareToExplore;PresentationCore.dll是包含已实现WPF的.NET framework程序集。问题中的目标框架是Silverlight,它与通常的.NET不兼容assemblies@dvvrd:您好,据我了解,我们需要在WCF服务端进行imageSource到byte[]的转换。客户端目标框架Silverlight是解码部分将出现的地方,这是一个不同的故事。因此,请您告诉我服务端的.NET程序集的不兼容性问题。另外,这里应该使用哪个库来拥有BitmapSource类等。BitmapSource、BitmapEncoder和BitmapFrame在PresentationCore.dll下可用。所以,在向这个库添加ref.之后,你也可以尝试dvvrd成员建议的方法。我尝试了上面的链接,但没有成功。BitmapSource和Encoder类也出现了一些错误,如Error1:System.Windows.Freezable类型是在未引用的程序集中定义的。您必须添加对程序集“WindowsBase,版本=4.0.0.0,区域性=中性,PublicKeyToken=31bf3856ad364e35”的引用。@DareToExplore;PresentationCore.dll为。
NET框架程序集,其中包含已实现的WPF。问题中的目标框架是Silverlight,它与通常的.NET不兼容assemblies@dvvrd:您好,据我了解,我们需要在WCF服务端进行imageSource到byte[]的转换。客户端目标框架Silverlight是解码部分将出现的地方,这是一个不同的故事。因此,请您告诉我服务端的.NET程序集的不兼容性问题。另外,这里应该使用哪个库来拥有BitmapSource类等。Thnks。可能的重复