none
關於使用Bitmap.Save在 GDI+ 中發生泛型錯誤 RRS feed

  • 問題

  • 大家好,我是VB新手

    目前遇到了使用【Bitmap.Save在 GDI+ 中發生泛型錯誤】這個問題

    以下是我的程式碼,錯誤發生在【img2.Save("C:\test.png")】這行

    有試過參考以下部落格,將圖片存在記憶體,再讀到 PictureBox 中,依然沒解決

    https://dotblogs.com.tw/chou/2009/07/31/9772

    再麻煩各位前輩給予指點了,非常感謝!

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 'OpenFileDialog() 是開啟檔案的指令,我定義了變數 OpenFileDialog1 來使用它 Dim OpenFileDialog1 As New OpenFileDialog() '指定檔案格式 OpenFileDialog1.Filter = "JPG|*.jpg|BMP|*.bmp|PPM|*.ppm|All Files|*.*" '使用 ShowDialog 方法顯示對話方塊,並使用 OpenFile 方法開啟檔案 If OpenFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then Dim img As String = OpenFileDialog1.FileName PictureBox1.Image = Image.FromFile(img) '載入圖片到 PictureBox1 PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage '用 StretchImage 調整圖片大小以適應 PictureBox1 的大小 '建立 Bitmap 影像物件,將 PictureBox1 裡的圖片暫時放入 img2 ,以便後續影像處理 Dim img2 As New Bitmap(PictureBox1.Image) PictureBox2.Image = img2 PictureBox2.SizeMode = PictureBoxSizeMode.StretchImage img2.Save("C:\test.png") End If End Sub


    2017年9月26日 上午 08:45

解答

  • 用系統管理員啟動你的程式再試一次,如果可以就是權限問題。 (Windows Vista 開始因為有 UAC,通常禁止一般使用者存取 C:\)

    強力監督SQL Injection問題!!

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

    2017年9月26日 下午 01:56
    版主
  • img As String 是等於 C:\test.png 嗎?

    Image.FromFile 會導致 img 所指向的檔案處於被鎖定狀態,不能寫入,如果要避免鎖定,一般來說會先用 MemoryStream 載入 img ,移除 img 參照後 (Stream 從檔案讀取時,會鎖定檔案),再由 Image.FromStream 載入。


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

    2017年9月26日 下午 05:00
  • 1) 先將圖片改存到非C碟根目錄的資料夾, 避開權限的問題

    2) 為PictureBox處理LoadCompleted事件, 將以下三行程式碼搬至LoadCompleted事件處理程序中:

    PictureBox2.Image = img2
    PictureBox2.SizeMode = PictureBoxSizeMode.StretchImage
    img2.Save("C:\test.png")

    變成這樣:

    Private Sub PictureBox1_LoadCompleted(sender as Object, e as AsyncCompletedEventArgs) _ 
          Handles PictureBox1.LoadCompleted
    
        PictureBox2.Image = img2
         PictureBox2.SizeMode = PictureBoxSizeMode.StretchImage
         img2.Save("test.png")
    
    End Sub
    


    2017年9月27日 上午 12:18

所有回覆

  • 我覺得是儲存路徑的問題

    img2.Save("C:\test.png")

    路徑改成 C:test.png試試看,或是換個儲存路徑

    2017年9月26日 下午 01:31
  • 用系統管理員啟動你的程式再試一次,如果可以就是權限問題。 (Windows Vista 開始因為有 UAC,通常禁止一般使用者存取 C:\)

    強力監督SQL Injection問題!!

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

    2017年9月26日 下午 01:56
    版主
  • img As String 是等於 C:\test.png 嗎?

    Image.FromFile 會導致 img 所指向的檔案處於被鎖定狀態,不能寫入,如果要避免鎖定,一般來說會先用 MemoryStream 載入 img ,移除 img 參照後 (Stream 從檔案讀取時,會鎖定檔案),再由 Image.FromStream 載入。


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

    2017年9月26日 下午 05:00
  • 1) 先將圖片改存到非C碟根目錄的資料夾, 避開權限的問題

    2) 為PictureBox處理LoadCompleted事件, 將以下三行程式碼搬至LoadCompleted事件處理程序中:

    PictureBox2.Image = img2
    PictureBox2.SizeMode = PictureBoxSizeMode.StretchImage
    img2.Save("C:\test.png")

    變成這樣:

    Private Sub PictureBox1_LoadCompleted(sender as Object, e as AsyncCompletedEventArgs) _ 
          Handles PictureBox1.LoadCompleted
    
        PictureBox2.Image = img2
         PictureBox2.SizeMode = PictureBoxSizeMode.StretchImage
         img2.Save("test.png")
    
    End Sub
    


    2017年9月27日 上午 12:18
  • 我測試你的程式,基本上沒問題(我是用C#,但是一模一樣的寫法),應該可能是你C槽下權限的問題。

    如果要更保險的方式,就是在存取檔案時,習慣加上Dispose會比較好。






    2017年9月28日 上午 06:53