2012-01-21 14 views
1

たとえば、標準のドットネットクラスを使用して保存できませんが(!)、読み取ることができる(例:幅と高さを調べる)サンプルJPEGがあります。元のファイル:Windowsイメージエディタで同じ画像を保存した後JPEG操作とドットネット - GDI +例外

http://dl.dropbox.com/u/5079317/184809_1_original.jpg

、すべてが素晴らしい作品: http://dl.dropbox.com/u/5079317/184809_1_resaved.jpg

私は長い時間前にこのバグに気づいたが、それは大きな問題ではなかったです。しかし、現在のプロジェクトでは、私は何千ものイメージを持っており、何か解決策が本当に必要です。

どのサードパーティライブラリを使用できますか?

ここ

は私が読んでいるかである:

public ImageFile SaveImage(HttpPostedFileBase file, string fileNameWithPath, bool splitImage, out string errorMessage) 
{ 
    try 
    { 
    using (var stream = file.InputStream) 
    { 
     using (Image source = Image.FromStream(stream)) 
     { 
     return SaveImage(source, fileNameWithPath, splitImage, out errorMessage); 
     // which actually do source.Save(fileNameWithPath, ImageFormat.Jpeg); 
     // Exception: A generic error occurred in GDI+. 
     } 
    } 
    } 
    catch (Exception e) 
    ... 
} 

答えて

0

サイズ変更は、問題を解決:

Image img2 = FixedSize(source, source.Width, source.Height, true); 
img2.Save(path, ImageFormat.Jpeg); 
0

を私はあなたがSaveImageのために使用しているものをライブラリわからないんだけど、あなただけの.NETを使用している場合は、無効と(以下Saveメソッドを呼び出します戻り値の型)を取得し、新しいファイルのSystem.Drawing.Imageオブジェクトに基づいて必要なオブジェクトを返します。

source.Save(@"C:\{path}\184809_1_resaved.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); 

詳細がなくても、私は画像ファイルクラスの実装がどのように見えるかわからないので、これは、私が提供できる最善の方法です。 ImageFileは現在の戻り値の型ですが、タイプを変更して正しく動作させるようにしました。

public System.IO.Stream SaveImage(HttpPostedFileBase file, string fileNameWithPath, bool splitImage, out string errorMessage) 
{ 
    try 
    { 
     using (var stream = file.InputStream) 
     { 
      using (System.Drawing.Image source = System.Drawing.Image.FromStream(stream)) 
      { 
       source.Save(@"C:\resaved.jpg", ImageFormat.Jpeg); 
       source.Save(stream, ImageFormat.Jpeg); 
       stream.Position = 0; 
       errorMessage = string.Empty; 
       return stream; 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     errorMessage = e.Message.ToString(); 
    } 
    return null; 
} 
0

Iirc一部のフォーマットはシークする必要がありますが、これはすべてのストリームでサポートされていません。あなたは、メモリストリームにバッファリングを試みる場合があります。同じサイズに元の画像の

using (var input = file.InputStream) 
using (var buffer = new MemoryStream()) 
{ 
    input.CopyTo(buffer); 
    buffer.Position = 0; // rewind 
    using (Image source = Image.FromStream(buffer)) 
    { ... Etc as before ... } 
}