私は自分のウェブサイトにアップロードされたイメージを縮小してトリミングするための簡単な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
dst.Save(m、format);あなたの問題のように見えます。デフォルトの品質(100%ではありません)でjpegとしてエンコードしています。それを直ちに画像にデコードします。 dstはすでにImage(BitmapクラスはImageから継承されています)なので、そのまま返すことができます。 – David
こんにちはDavid。あなたは正しかった。そのステップの背後にある私の推論は、mimetypeが結果のイメージの一部であるようにしていました。セッションに一時的にイメージを保存し、後でそれを取得できるようにしたかったのです。あなたがあなたの答えを更新する場合は、それを答えたものとしてマークしてください。 – madcapnmckay