2013-04-07 11 views
39

サムネイルフォルダに画像のサムネイルをアップロードして保存しようとしています。A Bitmap.SaveメソッドでGDI +で一般的なエラーが発生しました

私は次のリンク使用しています

:例外の原因となっている

http://weblogs.asp.net/markmcdonnell/archive/2008/03/09/resize-image-before-uploading-to-server.aspx

しかし

newBMP.Save(directory + "tn_" + filename); 

を "一般的なエラーがGDI +で発生しました。"

私はフォルダのパーミッションを与えようとしましたが、保存するときに新しい別のbmpオブジェクトを使用しようとしました。

編集:

protected void ResizeAndSave(PropBannerImage objPropBannerImage) 
    { 
     // Create a bitmap of the content of the fileUpload control in memory 
     Bitmap originalBMP = new Bitmap(fuImage.FileContent); 

     // Calculate the new image dimensions 
     int origWidth = originalBMP.Width; 
     int origHeight = originalBMP.Height; 
     int sngRatio = origWidth/origHeight; 
     int thumbWidth = 100; 
     int thumbHeight = thumbWidth/sngRatio; 

     int bannerWidth = 100; 
     int bannerHeight = bannerWidth/sngRatio; 

     // Create a new bitmap which will hold the previous resized bitmap 
     Bitmap thumbBMP = new Bitmap(originalBMP, thumbWidth, thumbHeight); 
     Bitmap bannerBMP = new Bitmap(originalBMP, bannerWidth, bannerHeight); 

     // Create a graphic based on the new bitmap 
     Graphics oGraphics = Graphics.FromImage(thumbBMP); 
     // Set the properties for the new graphic file 
     oGraphics.SmoothingMode = SmoothingMode.AntiAlias; oGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 

     // Draw the new graphic based on the resized bitmap 
     oGraphics.DrawImage(originalBMP, 0, 0, thumbWidth, thumbHeight); 

     Bitmap newBitmap = new Bitmap(thumbBMP); 
     thumbBMP.Dispose(); 
     thumbBMP = null; 

     // Save the new graphic file to the server 
     newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg); 

     oGraphics = Graphics.FromImage(bannerBMP); 
     // Set the properties for the new graphic file 
     oGraphics.SmoothingMode = SmoothingMode.AntiAlias; oGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 

     // Draw the new graphic based on the resized bitmap 
     oGraphics.DrawImage(originalBMP, 0, 0, bannerWidth, bannerHeight); 
     // Save the new graphic file to the server 
     bannerBMP.Save("~/image/" + objPropBannerImage.ImageId + ".jpg"); 


     // Once finished with the bitmap objects, we deallocate them. 
     originalBMP.Dispose(); 

     bannerBMP.Dispose(); 
     oGraphics.Dispose(); 
    } 

答えて

61

BitmapオブジェクトまたはImageオブジェクトのいずれかが ファイルから構成され、ファイルには、オブジェクトの寿命のためロックされたまま。 の結果として、画像を変更して元のファイル に戻すことはできません。 http://support.microsoft.com/?id=814675

A generic error occurred in GDI+, JPEG Image to MemoryStream

Image.Save(..) throws a GDI+ exception because the memory stream is closed

http://alperguc.blogspot.in/2008/11/c-generic-error-occurred-in-gdi.html

EDIT:
だけでメモリからの書き込み...

'仲介'メモリストリームに保存すると、動作するはずです。

これを試してみてください - のようなもので

Bitmap newBitmap = new Bitmap(thumbBMP); 
    thumbBMP.Dispose(); 
    thumbBMP = null; 
    newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg); 

を置き換える:

string outputFileName = "..."; 
using (MemoryStream memory = new MemoryStream()) 
{ 
    using (FileStream fs = new FileStream(outputFileName, FileMode.Create, FileAccess.ReadWrite)) 
    { 
     thumbBMP.Save(memory, ImageFormat.Jpeg); 
     byte[] bytes = memory.ToArray(); 
     fs.Write(bytes, 0, bytes.Length); 
    } 
} 
+0

ありがとう、これらを使用して私はそれが働いている。私は再びコードを投稿しています。 – donstack

+1

関連する問題、多分それは誰かを助けるでしょう - 私はビットマップ上に "GDI +で発生した一般的なエラー"を既に持っています。リモートWebサーバー上でのみ、私のローカルのテストマシンではありません。 Azure IISサーバー上のGDI +は、GIMPによって生成された新しい形式のBMPを処理できないことを示しています。私はa)BMPをペイントで再保存するb)代わりに非圧縮のPNGを使用するc)GMPと一緒に24ビットBMPとして保存する(悪い品質) – Andrew

8
// Once finished with the bitmap objects, we deallocate them. 
    originalBMP.Dispose(); 

    bannerBMP.Dispose(); 
    oGraphics.Dispose(); 

これは、あなたが、遅かれ早かれ後悔プログラミングスタイルです。すぐにドアをノックして、忘れてしまった。 newBitmapを処分していません。ガベージコレクタが実行されるまでファイルをロックします。 2回目に同じファイルに保存しようとすると、klaboomを取得します。 GDI +の例外は診断が難しいので頭が傷ついてしまいます。この間違いに言及した何千ものグーグルポストを超えて。

常にを使用して、ステートメントを使用してください。たとえコードが例外をスローしたとしても、オブジェクトを破棄することは決してありません。

using (var newBitmap = new Bitmap(thumbBMP)) { 
    newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg); 
} 

なぜ新しいビットマップを作成するのかについてはっきりしていないにもかかわらず、thumbBMPを保存するだけで十分であるはずです。Anyhooは、あなたの使い捨て物の残りの部分を愛を使って同じものにします。

+0

Hansさんに感謝します。同じエラーが発生するbitmap.Saveを使用してファイルを保存できません。 – donstack

0

私はそれがのFileStreamを使用して作業してしまった、あなたはBitmap.Save()に渡すパスが無効である場合には、これらの
http://alperguc.blogspot.in/2008/11/c-generic-error-occurred-in-gdi.html http://csharpdotnetfreak.blogspot.com/2010/02/resize-image-upload-ms-sql-database.html

System.Drawing.Image imageToBeResized = System.Drawing.Image.FromStream(fuImage.PostedFile.InputStream); 
     int imageHeight = imageToBeResized.Height; 
     int imageWidth = imageToBeResized.Width; 
     int maxHeight = 240; 
     int maxWidth = 320; 
     imageHeight = (imageHeight * maxWidth)/imageWidth; 
     imageWidth = maxWidth; 

     if (imageHeight > maxHeight) 
     { 
      imageWidth = (imageWidth * maxHeight)/imageHeight; 
      imageHeight = maxHeight; 
     } 

     Bitmap bitmap = new Bitmap(imageToBeResized, imageWidth, imageHeight); 
     System.IO.MemoryStream stream = new MemoryStream(); 
     bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg); 
     stream.Position = 0; 
     byte[] image = new byte[stream.Length + 1]; 
     stream.Read(image, 0, image.Length); 
     System.IO.FileStream fs 
= new System.IO.FileStream(Server.MapPath("~/image/a.jpg"), System.IO.FileMode.Create 
, System.IO.FileAccess.ReadWrite); 
      fs.Write(image, 0, image.Length); 
27

から助けを得るが、このエラーメッセージも(フォルダがなど存在しない)が表示されます。

+3

確かにこれは私の場合だった、私はそれを投票したので誰もそれ以上の時間を無駄にしてはならない。あなたのパスにもファイル名が含まれていることを確認してください。 – ahsant

+5

エラーがそのような基本的な問題 –

0

ハードディスクにフォルダパスイメージ/サムを作成=>問題が解決しました!私の場合すでにシステムドライブに存在していたビットマップ画像ファイルに

5

は、そう私のアプリは、「一般的なエラーがGDI +で発生した」エラーを投げました。

  1. 先のフォルダが
  2. が私のために先のフォルダ
0

で同じ名前のファイルが、それは権限の問題だった、すでに存在していないことを確認します存在することを確認します。誰かが、アプリケーションが実行されていたユーザーアカウントのフォルダに対する書き込み権限を削除しました。

6

、その後行くイメージがフォルダに 右クリックを保存しているフォルダのアクセス権を確認してください:

のプロパティ]> [セキュリティ]> [編集]> [「みんな」を選択し、「フルコントロール」

許可するチェックAdd--
3

私は一般的なエラーがMVCアプリケーションでの作業中に保存するにはGDI +で発生した同じ問題に直面していた、私は、画像を保存するために間違ったパスを書いていたので、このエラーを取得し、私パス保存修正されましたそれは私のためにうまくいった。

img1.Save(Server.MapPath("/Upload/test.png", System.Drawing.Imaging.ImageFormat.Png); 
0
I used below logic while saving a .png format. This is to ensure the file is already existing or not.. if exist then saving it by adding 1 in the filename 

Bitmap btImage = new Bitmap("D:\\Oldfoldername\\filename.png"); 
    string path="D:\\Newfoldername\\filename.png"; 
      int Count=0; 
       if (System.IO.File.Exists(path)) 
       { 
        do 
        { 
         path = "D:\\Newfoldername\\filename"+"_"+ ++Count + ".png";      
        } while (System.IO.File.Exists(path)); 
       } 

       btImage.Save(path, System.Drawing.Imaging.ImageFormat.Png); 
0

JPEG形式にTIFF画像を変換しようとしているときに、私はこのエラーが発生しました。私の問題は、ティフの大きさが大きすぎることに起因していました。最大約62000ピクセルまでは問題なく、このサイズを超えるものはエラーになりました。

0
私は常にチェック

/これらをテスト:

  • パス+ファイル名が指定されたファイルシステムのために不正な文字が含まれていますか?
  • ファイルは既に存在しますか? (悪い)
  • パスは既に存在しますか? (良い)
  • パスが相対パスの場合:正しい親ディレクトリ(ほとんどbin/Debug ;-))で期待していますか?
  • パスはプログラムに対して書き込み可能で、どのユーザーが実行しますか? (サービスは難しいかもしれません!)
  • 本当に完全なパスに本当に違法な文字が含まれていませんか?(いくつかのユニコード文字は不可視に近い)

このリストから離れたところでBitmap.Save()の問題は一度もありませんでした。

0

私にとっては、画像を保存するときのパスの問題でした。

int count = Directory.EnumerateFiles(System.Web.HttpContext.Current.Server.MapPath("~/images/savedimages"), "*").Count(); 

var img = Base64ToImage(imgRaw); 

string path = "images/savedimages/upImages" + (count + 1) + ".png"; 

img.Save(Path.Combine(System.Web.HttpContext.Current.Server.MapPath(path))); 

return path; 

だから私は前方に、以下を追加して、それを固定は、誰もがスタックに役立ちます

String path = "/images/savedimages.... 

希望する必要があります!

String path = "images/savedimages.... 

を大幅に削減します