一尘不染

将BitmapImage保存到文件

c#

我正在开发一个程序,可将图像从URL下载到bitmapimage并显示它。接下来,我尝试使用jpegbitmapencoder将位图图像保存到硬盘驱动器。文件已成功创建,但实际的jpeg图像为空或1个黑色像素。

public Guid SavePhoto(string istrImagePath)
{
    ImagePath = istrImagePath;

    BitmapImage objImage = new BitmapImage(
        new Uri(istrImagePath, UriKind.RelativeOrAbsolute));
    PictureDisplayed.Source = objImage;
    savedCreationObject = objImage;

    Guid photoID = System.Guid.NewGuid();
    string photolocation = photoID.ToString() + ".jpg";  //file name

    JpegBitmapEncoder encoder = new JpegBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(objImage));

    using (FileStream filestream = new FileStream(photolocation, FileMode.Create))
    {
        encoder.Save(filestream);
    }

    return photoID;
}

这是保存和显示照片的功能。照片正确显示,但是再次保存后,我得到一个空的jpeg或1个黑色像素。


阅读 789

收藏
2020-05-19

共1个答案

一尘不染

从Uri创建BitmapImage时,需要时间来下载图像。

如果您检查以下属性,则该值可能为TRUE

objImage.IsDownloading

这样,您可以将侦听器附加到DownloadCompleted事件处理程序,并将所有处理移至该EventHandler。

objImage.DownloadCompleted += objImage_DownloadCompleted;

该处理程序的外观如下所示:

private void objImage_DownloadCompleted(object sender, EventArgs e)
{
  JpegBitmapEncoder encoder = new JpegBitmapEncoder();
  Guid photoID = System.Guid.NewGuid();
  String photolocation = photoID.ToString() + ".jpg";  //file name

  encoder.Frames.Add(BitmapFrame.Create((BitmapImage)sender));

  using (var filestream = new FileStream(photolocation, FileMode.Create))
    encoder.Save(filestream);
}

您可能还希望为DownloadFailed添加另一个EventHandler,以便正常处理任何错误情况。

编辑

根据Ben的评论添加了完整的示例类:

public partial class MainWindow : Window
{
  public MainWindow()
  {
    InitializeComponent();

    SavePhoto("http://www.google.ca/intl/en_com/images/srpr/logo1w.png");
  }

  public void SavePhoto(string istrImagePath)
  {
    BitmapImage objImage = new BitmapImage(new Uri(istrImagePath, UriKind.RelativeOrAbsolute));

    objImage.DownloadCompleted += objImage_DownloadCompleted;
  }

  private void objImage_DownloadCompleted(object sender, EventArgs e)
  {
    JpegBitmapEncoder encoder = new JpegBitmapEncoder();
    Guid photoID = System.Guid.NewGuid();
    String photolocation = photoID.ToString() + ".jpg";  //file name

    encoder.Frames.Add(BitmapFrame.Create((BitmapImage)sender));

    using (var filestream = new FileStream(photolocation, FileMode.Create))
      encoder.Save(filestream);
  } 
}
2020-05-19