我正在开发一个程序,可将图像从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个黑色像素。
从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); } }