我已經編寫了一個簡單的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%以上。
我的問題是,有什麼區別,我在我的調整大小例程,缺少什麼設置可以解釋醜陋的結果。我喜歡讓我的調整大小例程產生與簡單調整大小完全相同的結果。
非常感謝您的幫助。這是我第一次進入圖像處理領域。
編輯
簡單調整大小(82KB)
simple http://img189.imageshack.us/img189/2137/simpleresize.jpg
我調整大小(55KB)
complex http://img12.imageshack.us/img12/4023/complexresize.jpg
dst.Save(m,format);看起來像你的問題。您將它編碼爲jpeg,默認質量(不是100%),然後立即將其解碼爲圖像。 dst已經是一個Image(位圖類繼承自Image),所以你可以直接返回它。 – David 2009-07-22 05:17:18
嗨大衛。你是對的。我在這一步背後的推理是,mimetype是最終圖像的一部分。我暫時將該圖像存儲在會話中,並希望能夠稍後檢索它。如果您更新答案,請將其標記爲已回答。 – madcapnmckay 2009-07-22 12:01:38