我在視圖中有一個影像,它系結到視圖模型中的位元組陣列。
<Image
Source="{Binding InputImage, Converter={StaticResource imageConvertor}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Panel.ZIndex="1"
x:Name="UploadImage"
Grid.Column="0"
Grid.Row="0"
Stretch="Uniform"
Margin="5"
/>
private byte[] inputImage;
public byte[] InputImage
{
get { return inputImage; }
set
{
inputImage = value;
OnPropertyChanged(nameof(InputImage));
}
}
用戶通過執行此命令的按鈕加載影像
OpenFileDialog op = new OpenFileDialog();
op.Title = "Select a picture";
op.Filter = "All supported graphics|*.jpg;*.jpeg;*.png|"
"JPEG (*.jpg;*.jpeg)|*.jpg;*.jpeg|"
"Portable Network Graphic (*.png)|*.png";
if (op.ShowDialog() == true) { UploadImage.Source = new BitmapImage(new Uri(op.FileName)); }
問題是當我嘗試加載影像時,轉換器接收 null 作為引數。如果我從 xaml 檔案中的系結中洗掉轉換器,它會成功加載到視圖中,但不能系結到視圖模型中的屬性。
這是轉換器的實作
public class ByteArrayToBitmapImageConverter : IValueConverter
{
public object Convert(object? value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
{
return null;
}
else
return ToImage(value as byte[]);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
{
return null;
}
else
return ToBinary(value as Image);
}
public static Image ToImage(Byte[] binary)
{
Image image = null;
if (binary == null || binary.Length < 100) return image;
using (MemoryStream ms = new MemoryStream(binary))
{
image = Image.FromStream(ms);
}
return image;
}
public static Byte[] ToBinary(Image image)
{
if (image == null) return null;
using (MemoryStream memoryStream = new MemoryStream())
{
image.Save(memoryStream, ImageFormat.Png);
return memoryStream.ToArray();
}
}
}
什么導致空輸入?
uj5u.com熱心網友回復:
您正在使用 WinFormsImage類而不是 WPF BitmapSource。BitmapSource 是 的子類ImageSource,它是 Image 元素Source屬性的型別。
您的轉換器應如下所示:
public class ByteArrayToBitmapSourceConverter : IValueConverter
{
public object Convert(
object value, Type targetType, object parameter, CultureInfo culture)
{
return ToBitmapSource(value as byte[]);
}
public object ConvertBack(
object value, Type targetType, object parameter, CultureInfo culture)
{
return ToByteArray(value as BitmapSource);
}
public static BitmapSource ToBitmapSource(byte[] buffer)
{
BitmapSource bitmap = null;
if (buffer != null)
{
using (var stream = new MemoryStream(buffer))
{
bitmap = BitmapFrame.Create(
stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
}
}
return bitmap;
}
public static byte[] ToByteArray(BitmapSource bitmap)
{
byte[] buffer = null;
if (bitmap != null)
{
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmap));
using (var stream = new MemoryStream())
{
encoder.Save(stream);
buffer = stream.ToArray();
}
}
return buffer;
}
}
但是,將影像檔案中的幀緩沖區直接分配給視圖模型屬性會簡單得多,例如
viewModel.InputImage = File.ReadAllBytes(op.FileName);
您根本不需要轉換器,因為由于內置型別轉換,該Image.Source屬性可以直接系結到 type 的源屬性string,Uri并且byte[](除了ImageSource)。
所以你可以簡單地寫
<Image Source="{Binding InputImage}" ... />
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/481276.html
上一篇:WPF呼叫異步方法的結果導致阻塞
