我很擅长以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'”我对如何解决这个问题完全傻了。
答案 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);