2010-11-12 9 views
20

पर सहेजें मैं एक ऐसे प्रोग्राम पर काम कर रहा हूं जो एक यूआरएल से बिटमैपीमेज में छवियों को डाउनलोड करता है और इसे प्रदर्शित करता है। इसके बाद मैं jpegbitmapencoder का उपयोग कर हार्डमैव में बिटमैपिमेज को सहेजने का प्रयास करता हूं। फ़ाइल सफलतापूर्वक बनाई गई है लेकिन वास्तविक जेपीईजी छवि खाली है या 1 ब्लैक पिक्सेल है।BitmapImage को फ़ाइल

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 
    FileStream filestream = new FileStream(photolocation, FileMode.Create); 
    JpegBitmapEncoder encoder = new JpegBitmapEncoder(); 
    encoder.Frames.Add(BitmapFrame.Create(objImage)); 
    encoder.Save(filestream); 

    return photoID; 
} 

यह वह फ़ंक्शन है जो फ़ोटो को सहेजता और प्रदर्शित करता है। तस्वीर सही ढंग से प्रदर्शित होती है लेकिन जब इसे सहेजा जाता है तो मुझे खाली जेपीईजी या 1 ब्लैक पिक्सेल मिलता है।

+0

बस encoder.Frames.Add उपयोग कर सकते हैं (BitmapFrame.Create (नया लिखने योग्य बिटमैप (objImage))); – Andreas

उत्तर

28

जब आप उरी से अपना बिटमैप इमेज बनाते हैं, तो छवि को डाउनलोड करने के लिए समय की आवश्यकता होती है।

आप निम्नलिखित संपत्ति चेक करते हैं, मूल्य की संभावना सही

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 जोड़ना चाहते हैं जाएगा।

संपादित

जोड़ा पूर्ण नमूना बेन टिप्पणी के आधार पर वर्ग:

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); 
    } 
} 
+0

मैंने आपके कोड का परीक्षण किया और वही समस्या अभी भी होती है। सहेजा गया jpeg खाली है या 1 काला पिक्सेल है। –

+0

@ बेन - कोड चलाता है ... अद्यतन उत्तर पूर्ण नमूना कोड होगा जो मैं अपने उत्तर का परीक्षण करने के लिए उपयोग करता था; क्या ये तुम्हारे लिए कारगर है? 9 केबी Google लोगो को डाउनलोड करना चाहिए और इसे डिस्क पर सहेजना चाहिए। –

+0

धन्यवाद आपका कोड पूरी तरह से काम करता है और यह मेरे कोड में भी काम करता है। जैसा कि आपने बताया था कि तस्वीर उरी से पूरी तरह से डाउनलोड नहीं हुई थी। फिर से धन्यवाद। –

4

क्रिस बैक्सटर के समाधान पर विस्तार, इस कनवर्टर स्थानीय संस्करण यदि वह मौजूद है का उपयोग करता है, अन्यथा यह डाउनलोड और फ़ाइल की बचत होती है ।

using System; 
using System.Globalization; 
using System.IO; 
using System.Windows.Data; 
using System.Windows.Media.Imaging; 

namespace MyNamespace 
{ 
    public sealed class UriToCachedImageConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      var url = value as string; 
      if (url == null) 
       return null; 

      var webUri = new Uri(url, UriKind.Absolute); 
      var filename = Path.GetFileName(webUri.AbsolutePath); 

      var localFilePath = Path.Combine("C:\\MyImagesFolder\\", filename); 

      if (File.Exists(localFilePath)) 
      { 
       return BitmapFrame.Create(new Uri(localFilePath, UriKind.Absolute)); 
      } 

      var image = new BitmapImage(); 
      image.BeginInit(); 
      image.CacheOption = BitmapCacheOption.OnLoad; 
      image.UriSource = webUri; 
      image.EndInit(); 

      SaveImage(image, localFilePath); 

      return image; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 

     public void SaveImage(BitmapImage image, string localFilePath) 
     { 
      image.DownloadCompleted += (sender, args) => 
      { 
       var encoder = new PngBitmapEncoder(); 
       encoder.Frames.Add(BitmapFrame.Create((BitmapImage) sender)); 
       using (var filestream = new FileStream(localFilePath, FileMode.Create)) 
       { 
        encoder.Save(filestream); 
       } 
      }; 
     } 
    } 
} 

और सुनिश्चित करें कि आप अपने XAML

<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:u="clr-namespace:MyNamespace"   
      d:DesignHeight="500" 
      d:DesignWidth="420"> 
    <UserControl.Resources> 
     <ResourceDictionary> 
      <u:UriToCachedImageConverter x:Key="UrlToCachedImageConverter" /> 
     </ResourceDictionary> 
    </UserControl.Resources>    
</UserControl> 

भीतर कनवर्टर का उपयोग और एक छवि पर कनवर्टर का उपयोग

<Image Source="{Binding URL, Mode=OneWay, Converter={StaticResource UrlToCachedImageConverter}, IsAsync=true}"/> 
संबंधित मुद्दे