WPF C#图像源

时间:2016-03-04 01:39:26

标签: c# wpf image

我很擅长以WPF格式显示图像,而且在为我的GUI转换和分配图像源方面遇到了麻烦。

        System.Drawing.Image testImg = ImageServer.DownloadCharacterImage(charID, ImageServer.ImageSize.Size128px);
        byte[] barr = imgToByteArray(testImg);
        CharImage.Source = ByteToImage(barr);          

    public byte[] imgToByteArray(System.Drawing.Image testImg)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            testImg.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
            return ms.ToArray();
        }
    }

    public System.Drawing.Image ByteToImage(byte[] barr)
    {
        MemoryStream ms = new MemoryStream(barr);
        System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms);
        return returnImage;
    }

所以我从EVE Online C#API库中获取图像(JPEG),然后尝试将其转换为字节数组并返回到正确的图像。但是我总是得到这个错误:“不能隐式地将类型'System.Drawing.Image'转换为'System.Windows.Media.ImageSource'”我对如何解决这个问题完全傻了。

2 个答案:

答案 0 :(得分:2)

一种可能的解决方案是将图像文件(例如。jpg)保存为WPF嵌入式资源,然后使用以下代码段获取BitmapImage

清单1.从EmbeddedResource获取BitmapImage

private string GetAssemblyName()
{
    try { return Assembly.GetExecutingAssembly().FullName.Split(',')[0]; }
    catch { throw; }
}

private BitmapImage GetEmbeddedBitmapImage(string pathImageFileEmbedded)
{
    try
    {
        // compose full path to embedded resource file
        string _fullPath = String.Concat(String.Concat(GetAssemblyName(), "."), pathImageFileEmbedded);

        BitmapImage _bmpImage = new BitmapImage();
        _bmpImage.BeginInit();
        _bmpImage.StreamSource = Assembly.GetExecutingAssembly().GetManifestResourceStream(_fullPath);
        _bmpImage.EndInit();
        return _bmpImage;
    }
    catch { throw; }
    finally { }
}

相应地,将WPF Source控件的Image属性(例如Image1)设置为函数返回的BitmapImage

Image1.Source = GetEmbeddedBitmapImage(_strEmbeddedPath);

注意:您应该参考以下内容:

using System.Windows.Media.Imaging;
using System.Reflection;

另一种可能的解决方案是使用BitmapImage对象从映像文件中获取Uri,如以下代码片段所示(清单2):

清单2.从File获取BitmapImage(使用Uri)

private BitmapImage GetBitmapImageFromFile(string ImagePath)
{
    Uri BitmapUri;
    StreamResourceInfo BitmapStreamSourceInfo;
    try
    {
        // Convert stream to Image.
        BitmapImage bi = new BitmapImage();
        BitmapUri = new Uri(ImagePath, UriKind.Relative);
        BitmapStreamSourceInfo = Application.GetResourceStream(BitmapUri);
        bi.BeginInit();
        bi.StreamSource = BitmapStreamSourceInfo.Stream;
        bi.EndInit();
        return bi;
    }
    catch { throw; }
}

希望这可能会有所帮助。

答案 1 :(得分:2)

System.Drawing.Image是WinForms,而不是WPF。你的ByteToImage方法应该返回BitmapSource

从字节数组创建BitmapSource的最简单方法是BitmapFrame.Create

public BitmapSource ByteArrayToImage(byte[] buffer)
{
    using (var stream = new MemoryStream(buffer))
    {
        return BitmapFrame.Create(stream,
            BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
    }
}

您可以将上述方法的返回值分配给Source控件的Image属性:

image.Source = ByteArrayToImage(barr);