2009-07-21 12 views
2

私は自分のウェブサイトにアップロードされたイメージを縮小してトリミングするための簡単なPhotoEditorヘルパークラスを作成しました。すべてが機能していますが、画像がファイルに保存されるときに不満足な品質が見えています。私は、以下の調整が可能な別の設定を読んでいます。サイズ変更のセットアップは同じです。イメージのサイズをリサイズする

public Image ResizeImage(Image imgToResize, Size size) 
    { 
     int sourceWidth = imgToResize.Width; 
     int sourceHeight = imgToResize.Height; 

     float nPercentW = (size.Width/(float) sourceWidth); 
     float nPercentH = (size.Height/(float) sourceHeight); 

     float nPercent = nPercentH < nPercentW ? nPercentH : nPercentW; 

     var destWidth = (int) (sourceWidth*nPercent); 
     var destHeight = (int) (sourceHeight*nPercent); 

     var src = imgToResize; 

     using (var dst = new Bitmap(destWidth, destHeight, imgToResize.PixelFormat)) 
     { 
      dst.SetResolution(imgToResize.HorizontalResolution, imgToResize.VerticalResolution); 

      using (var g = Graphics.FromImage(dst)) 
      { 
       var mime = GetMimeType(imgToResize); 
       ImageFormat format; 
       if (mime == "image/gif" || mime == "image/png") 
       { 
        //convert all gif to png, better resize quality 
        g.SmoothingMode = SmoothingMode.AntiAlias; 
        g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
        g.DrawImage(src, 0, 0, dst.Width, dst.Height); 
        format = ImageFormat.Png; 
       } 
       else 
       { 
        //jpeg 
        g.CompositingQuality = CompositingQuality.HighQuality; 
        g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
        g.SmoothingMode = SmoothingMode.HighQuality; 
        g.PixelOffsetMode = PixelOffsetMode.HighQuality; 
        format = ImageFormat.Jpeg; 
       } 
       g.DrawImage(src, 0, 0, dst.Width, dst.Height); 

       // At this point the new bitmap has no MimeType 
       // Need to output to memory stream 
       var m = new MemoryStream(); 
       dst.Save(m, format); 

       var img = Image.FromStream(m); 

       return img; 
      } 
     } 
    } 

あなたは、私はまた、品質のJPEGを保存していますなどのスムージング、補間するための推奨設定を使用しています見ることができるように100

にダウンサイズ変更時結果の画像でも目立つボケやアーティファクトを持っています元のサイズの75%です。私は周りを見回し、これはお勧めの方法です。私はサイズを変更する単純な方法を見つけ、それを与えることにしました。

Bitmap NewImg = new Bitmap(original, new Size(387,257)); 
editor.SaveImage(@"C:\simpleResize.jpg", NewImg, ImageFormat.Jpeg); 

驚いたことに、これはかなり大きいイメージですが、メモリフットプリントが30%大きくなりました。

私の質問は、違いは何ですか、私は醜い結果を説明する可能性のあるサイズ変更ルーチンには何が欠けていますか。 Idは私のサイズ変更ルーチンを単純なサイズ変更と全く同じ結果を得るようにしたい。

あなたのヘルプははるかに高く評価されます。これは画像処理への私の最初の挑戦です。

EDIT

シンプルなリサイズ(82キロバイト)

simple http://img189.imageshack.us/img189/2137/simpleresize.jpg

マイリサイズ(55キロバイト)

complex http://img12.imageshack.us/img12/4023/complexresize.jpg

+1

dst.Save(m、format);あなたの問題のように見えます。デフォルトの品質(100%ではありません)でjpegとしてエンコードしています。それを直ちに画像にデコードします。 dstはすでにImage(BitmapクラスはImageから継承されています)なので、そのまま返すことができます。 – David

+0

こんにちはDavid。あなたは正しかった。そのステップの背後にある私の推論は、mimetypeが結果のイメージの一部であるようにしていました。セッションに一時的にイメージを保存し、後でそれを取得できるようにしたかったのです。あなたがあなたの答えを更新する場合は、それを答えたものとしてマークしてください。 – madcapnmckay

答えて

2

は、私が最初に考えたのは、.NETのJPEGエンコーダは、クロマを使用していることでした最高品質のセッティングでもサブサンプリングgであるので、カラー情報は半分の解像度で保存されます。設定は私が知る限りハードコードされています。しかし、それは第2の例でより良い品質を得る理由を説明しません。 2番目の場合は、アンチエイリアスを使用していない場合よりシャープな(しかし、より品質の低い)イメージを与え、アーティファクトは気付かれなくなりました。

編集:dst.Save(m、format);あなたの問題のように見えます。デフォルトの品質(100%ではありません)でjpegとしてエンコードしています。それを直ちに画像にデコードします。 DSTは既に(Bitmapクラスは、イメージからの継承)の画像であるので、私はあなたを助けるかもしれない(私はソースを忘れてしまった申し訳ありません)このコードの例スニペットた

+0

迅速な対応をありがとう。 AAの設定を変更して、役立つかどうかを確認しようとしましたが、アーチファクトの原因とは思われません。私はシンプルなサイズ変更と複合体の間で後ろから四番目に反転しています、そして、工芸品は複合体上にのみ存在します。 – madcapnmckay

+0

デフォルトの品質は誰でも知っていますか? – Liam

4

であるとして、あなたはそれを返すことができます。

// Create parameters 
EncoderParameters params = new EncoderParameters (1); 

// Set quality (100) 
params.Param[0] = new EncoderParameter(Encoder.Quality, 100); 

// Create encoder info 
ImageCodecInfo codec = null; 
foreach (ImageCodecInfo codectemp in ImageCodecInfo.GetImageDecoders()) 
{ 
    if (codectemp.MimeType == "image/jpeg") 
    { 
     codec = codectemp; 
     break; 
    } 
} 

// Check 
if (codec == null) 
    throw new Exception("Codec not found for image/jpeg"); 

// Save 
image.Save(filename, codec, params); 
+0

ニース。それは画像の品質を保持し、画像サイズを縮小する。 – Gabriel

関連する問題