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'"我对如何解决这个问题完全傻眼了。
一种可能的解决方案是保存图像文件(例如,.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);