我正在尝试从用户剪贴板保存图像。我能够从剪贴板图像中获取所有正确的数据到Bitmapsource。我正在尝试保存到Bitmapimage,以便我可以将文件上传到网站。将Bitmapsource转换为Bitmapimage时,所有Bitmapimages数据都保持为null并将引发异常。
private void Window_KeyDown(object sender, KeyEventArgs e)
{
if ((Keyboard.Modifiers == ModifierKeys.Control) && (e.Key == Key.V))
{
if (Clipboard.ContainsImage())
{
BitmapSource bitmapSource = Clipboard.GetImage();
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
MemoryStream memoryStream = new MemoryStream();
BitmapImage bImg = new BitmapImage();
encoder.Frames.Add(BitmapFrame.Create(bitmapSource));
encoder.Save(memoryStream);
bImg.BeginInit();
bImg.StreamSource = new MemoryStream(memoryStream.ToArray());
bImg.EndInit();
var client = new WebClient();
var uri = bImg.UriSource;
var path = uri.AbsolutePath;
//client.UploadFile(link, path);
}
}
}
两者
var uri = bImg.UriSource;
var path = uri.AbsolutePath;
将抛出类型' System.NullReferenceException'的未处理异常。发生在WpfApplication1.exe
附加信息:未将对象引用设置为对象的实例
答案 0 :(得分:1)
从其StreamSource
属性创建BitmapImage不会神奇地设置其UriSource
属性。你根本不需要那个BitmapImage。
将原始BitmapSource写入FileStream而不是MemoryStream,并上传该文件:
string path = ...
using (var fileStream = new FileStream(path, FileMode.Create))
{
encoder.Save(fileStream);
}
client.UploadFile(link, path);
甚至可能没有必要创建一个中间文件。只需上传MemoryStream的缓冲区:
using (var memoryStream = new MemoryStream())
{
encoder.Save(memoryStream);
client.UploadData(link, memoryStream.ToArray());
}