无法将Bitmapsource保存到Bitmapimage

时间:2015-03-30 05:31:55

标签: c# wpf

我正在尝试从用户剪贴板保存图像。我能够从剪贴板图像中获取所有正确的数据到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

附加信息:未将对象引用设置为对象的实例

1 个答案:

答案 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());
}