WPF C# Image Source

本文关键字:Source Image WPF | 更新日期: 2023-09-27 18:37:14

我对在 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'"我对如何解决这个问题完全傻眼了。

WPF C# Image Source

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

清单 1.从嵌入资源获取位图图像

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 Image控件的 Source 属性(例如,Image1 )设置为函数返回的BitmapImage

Image1.Source = GetEmbeddedBitmapImage(_strEmbeddedPath);

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

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

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

清单 2.从文件获取位图图像(使用 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; }
}

希望这可能会有所帮助。

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

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

image.Source = ByteArrayToImage(barr);