none
求助:在 GDI+ 中發生泛型錯誤 RRS feed

  • 問題

  • public bool addItem(string[] data, Image pic)
            {
                MemoryStream stream=new MemoryStream();
                pic.Save(stream,System.Drawing.Imaging.ImageFormat.Jpeg);   //error: 在 GDI+ 中發生泛型錯誤
                byte[] picData=stream.ToArray();

    我想把picturebox 的圖片儲存入mssql, 但在轉成byte的過程中出現GDI+ 中發生泛型錯誤。
    請問怎樣解決此問題?
    2009年12月24日 上午 09:32

解答

  • 你的 pic 是哪裡來的?
    如果是 MemoryStream,則該來源 MemoryStream 不可以 close。
    如果是檔案,那檔案不可以被鎖定,否則一樣會擲出 GDI+ Generic Exception。
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    如果只會用 "看" 的學程式,那不如早點改行,以免誤己一生...
    若不想快點得到解答,可以儘量把問題寫模糊一點,愈模糊愈不會得到解答。
    除非不能打中文,否則請尊重當地語系的網友,使用中文發問或回答,這是一種基本禮貌。
    • 已標示為解答 鏡影 2009年12月25日 上午 03:21
    2009年12月24日 上午 09:57
    版主

所有回覆

  • Hi,
    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2009年12月24日 上午 09:37
  • 謝謝你的資料, 如果我可以看到圖片是否表示檔案系統沒有問題?
    • 與『圖檔格式』有關的問題
      • 透過 Image.FromStream 載入圖片時,其 Stream 無法使用 Seek 方法
        解決之道 : 將無法 Seek 的 Stream 先寫入 MemoryStream 再進行載入即可。在 MSDN 上 Image.FromStream 的備註有寫:「在 Image 的存留期內,資料流都必須保持開啟。」
      • 遇到了無法轉換的圖檔類型
        解決之道 : 一般來說,GIF, JPEG, PNG 應該都沒問題,但還是有些圖檔格式無法透過 GDI+ 進行轉換,這時也會發生錯誤。遇到這個問題必須透過 UI 告訴使用者避開一些無法轉換的圖檔類型。我之前會遇到這個問題是因為在測試時亂選圖,剛好選到一張不能轉換成功的圖 ( 註: 該圖檔好像是顏色數非常少的 GIF 檔,年代有點久遠我記不太清楚了 )

    我使用的圖檔格式是jpeg, 我有使用MemoryStream, 但寫入MemoryStream時出現error。
    2009年12月24日 上午 09:48
  • 你的 pic 是哪裡來的?
    如果是 MemoryStream,則該來源 MemoryStream 不可以 close。
    如果是檔案,那檔案不可以被鎖定,否則一樣會擲出 GDI+ Generic Exception。
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    如果只會用 "看" 的學程式,那不如早點改行,以免誤己一生...
    若不想快點得到解答,可以儘量把問題寫模糊一點,愈模糊愈不會得到解答。
    除非不能打中文,否則請尊重當地語系的網友,使用中文發問或回答,這是一種基本禮貌。
    • 已標示為解答 鏡影 2009年12月25日 上午 03:21
    2009年12月24日 上午 09:57
    版主
  • pic是由c:的檔案 -> picturebox -> datagridview, 再從datagridview取得
    檔案沒有被鎖定
    picturebox已經close
    2009年12月24日 上午 10:08
  • 都 Close 了表示沒有來源啊...
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    如果只會用 "看" 的學程式,那不如早點改行,以免誤己一生...
    若不想快點得到解答,可以儘量把問題寫模糊一點,愈模糊愈不會得到解答。
    除非不能打中文,否則請尊重當地語系的網友,使用中文發問或回答,這是一種基本禮貌。
    2009年12月24日 上午 10:28
    版主
  • openFileDialog.ShowDialog();
    if (!string.IsNullOrEmpty(openFileDialog.FileName))
    {
        picBox.ImageLocation = openFileDialog.FileName;
        picBox.Load();
        MemoryStream stream = new MemoryStream();
        picBox.Image.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg); //在 GDI+ 中發生泛型錯誤
    }

    我沒有close picturebox 都出現同樣的錯誤
    2009年12月25日 上午 01:55
  • 用 Graphics.DrawImage 將圖畫到 New Bitmap 上,再用 Image.Save 存看看,有些是圖檔格式不支援另存,這種情形在 .Net 1.1 上比較嚴重,到了 .Net 2.0 雖然有改善,但是還有不支援的。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2009年12月25日 上午 02:15
  • 謝謝你的建意, 但我用的是.net 3.5, 格式又是普通的jpeg, 應該不是這問題吧...
    2009年12月25日 上午 02:50
  • Hi,

    讀檔部分改為
    picBox.Image = new Bitmap(openFileDialog.FileName);


    picBox.Image = Image.FromFile(openFileDialog.FileName);

    試試
    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2009年12月25日 上午 03:10
  • 已經解決此問題了謝謝各位
    應該是因為picBox.Load鎖定了檔案
    改用picBox.LoadAsync就沒問題了
    2009年12月25日 上午 03:20
  • Hi,

    Sorry~
    我覺得問題不是鎖定檔案造成的
    你可以把Code改為用picBox.Image = Image.FromFile(openFileDialog.FileName);的方式試試
    我這邊試是正常的

    而在MSDN中
    Image.FromFile 方法 (String)

    有提到
    備註

    檔案會保持鎖定,直到已處置 Image 為止。


    很明顯的使用Image.FromFile方式是會鎖定檔案的。
    但這方法套到您的程式卻可以正常運作,代表您的問題並不是由檔案鎖定造成。

    而應該是像下面這篇所提的
    Cannot save image after load in C# 2008


    摘錄片段如下:
    "GDI+, and therefore the System.Drawing namespace, may defer the decoding of raw image bits until the bits are required by the image. Additionally, even after the image has been decoded, GDI+ may determine that it is more efficient to discard the memory for a large Bitmap and to re-decode later. Therefore, GDI+ must have access to the source bits for the image for the life of the Bitmapor the Image object.

    To retain access to the source bits, GDI+ locks any source file, and forces the application to maintain the life of any source stream, for the life of the Bitmap or the Image object."


    另附上一篇跟你作的類似的文章

    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2009年12月25日 上午 04:36
  • 既有討論:
    http://social.msdn.microsoft.com/Forums/zh-TW/230/thread/230717a2-4c90-4638-a852-acf94edbab9f


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2009年12月25日 上午 04:53
  • 我把code 改為用picBox.Image = Image.FromFile(openFileDialog.FileName); 可以正常使用
    那麼使用load問題在那裡??
    2009年12月25日 上午 07:37