none
從URL抓圖存檔,結果存的圖片無內容 RRS feed

  • 問題

  • private void button_Click(object sender, RoutedEventArgs e)
    {
        string picPath = "https://www.google.com.tw/images/nav_logo242.png";
        BitmapImage bi = new BitmapImage();
        bi.BeginInit();
        bi.UriSource = new Uri(picPath, UriKind.Absolute);
        bi.EndInit();
        image1.Source = bi;
    
        var encoder = new JpegBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(bi));
        using (var filestream = new FileStream("Goo.jpg", FileMode.Create))
        {
            encoder.Save(filestream);
        }
    }

    1. GUI上可以正確顯示圖片,但是存下來的都是無法顯示的圖片,找不到原因。
    2. 請問這個需求有更精簡的寫法嗎?
    2016年2月2日 下午 07:06

解答

  • 你有去看那一篇討論的解答嗎?

    在 WPF (Windows 8, Universal Windows Platform) 裡面,網路的操作都是非同步的,但你的寫法是同步的寫法,人家圖片可能都還沒下載完你的程式就存了,這樣會正確才有鬼吧...


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 mosdeo 2016年2月4日 下午 02:39
    2016年2月3日 下午 11:15
    版主
  • GUI能夠正常顯示也是非同步下載成功才顯示出來的, 所以存檔的動作一定要等待下載成功後才做, 否則一定無法顯示

    • 已標示為解答 mosdeo 2016年2月4日 下午 02:40
    2016年2月4日 上午 02:46
  • 就是個微妙的內部非同步行為. 從 BitmapImage Class 有個 DownloadCompleted Event 就看得出來它內部有使用非同步的方式, 否則不會設計這種事件通知機制.

    事實上, 在你"看到"之前, 程式早就跑到要存檔的地方了. 


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 mosdeo 2016年2月4日 下午 02:31
    2016年2月4日 下午 12:53
    版主

所有回覆

  • 應該是圖片尚未傳送完畢, 就先做存檔的動作, 所以無法顯示, 您可以等待圖片下載完成再執行存檔, 應該就可以成功, 請參考:Save BitmapImage to File

    2016年2月3日 上午 01:48
  • 直接用 WebRequest 請求並下載呢?

    理直氣和,切記。

    個人

    2016年2月3日 上午 01:50
  • WebClient

    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2016年2月3日 下午 12:17
  • 我挺好奇是誰教你用這種方式 "下載" 網路上的圖片...

    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2016年2月3日 下午 03:07
    版主
  • 我挺好奇是誰教你用這種方式 "下載" 網路上的圖片...


    stack overflow找的。
    • 已編輯 mosdeo 2016年2月3日 下午 06:12
    2016年2月3日 下午 06:08
  • 應該是圖片尚未傳送完畢, 就先做存檔的動作, 所以無法顯示, 您可以等待圖片下載完成再執行存檔, 應該就可以成功, 請參考:Save BitmapImage to File

    但是我在GUI上能正確顯示耶,程式的流程是先顯示才存檔。
    2016年2月3日 下午 06:09
  • 應該是圖片尚未傳送完畢, 就先做存檔的動作, 所以無法顯示, 您可以等待圖片下載完成再執行存檔, 應該就可以成功, 請參考:Save BitmapImage to File

    我就是看這篇改的阿。

    覺得太複雜了,存個圖應該不需要那麼多function,自己改簡單。

    雖然可能改錯了,不過寫錯了就照抄不好,想找出自己的程式碼錯誤。

    2016年2月3日 下午 06:15
  • WebClient

    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    改用別的方法之前,我想先知道為什麼這樣做不行?都已經能在GUI上看到了,沒理由存不下來。
    2016年2月3日 下午 08:22
  • 你有去看那一篇討論的解答嗎?

    在 WPF (Windows 8, Universal Windows Platform) 裡面,網路的操作都是非同步的,但你的寫法是同步的寫法,人家圖片可能都還沒下載完你的程式就存了,這樣會正確才有鬼吧...


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 mosdeo 2016年2月4日 下午 02:39
    2016年2月3日 下午 11:15
    版主
  • GUI能夠正常顯示也是非同步下載成功才顯示出來的, 所以存檔的動作一定要等待下載成功後才做, 否則一定無法顯示

    • 已標示為解答 mosdeo 2016年2月4日 下午 02:40
    2016年2月4日 上午 02:46
  • 就是個微妙的內部非同步行為. 從 BitmapImage Class 有個 DownloadCompleted Event 就看得出來它內部有使用非同步的方式, 否則不會設計這種事件通知機制.

    事實上, 在你"看到"之前, 程式早就跑到要存檔的地方了. 


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 mosdeo 2016年2月4日 下午 02:31
    2016年2月4日 下午 12:53
    版主