Ich habe eine einfache PhotoEditor-Hilfsklasse geschrieben, um Bilder, die auf meine Website hochgeladen wurden, zu verkleinern und zu beschneiden. Alles funktioniert, aber ich sehe eine unbefriedigende Qualität, wenn das Bild in der Datei gespeichert wird. Ich habe über die verschiedenen Einstellungen gelesen, die Sie unten optimieren können, ist meine Einstellung für das Ändern der Größe, das Zuschneiden ist identisch.Skalierung der Bildqualitätsreduktion
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;
}
}
}
Wie man sehen kann ich die vorgeschlagenen Einstellungen für die Interpolation verwenden, Glättung usw. Ich bin auch die JPEG mit Qualität Speicher 100.er
Das resultierende Bild hat spürbar Verwischung und Artefakte, auch wenn die Größenänderung nach unten zu eine bescheidene 75% seiner ursprünglichen Größe. Ich schaute mich um und das ist der empfohlene Weg. Ich fand einen vereinfachten Weg, um die Größe zu ändern und entschied mich, es zu versuchen.
Überraschenderweise erzeugt dies ein viel schöneres Bild, obwohl es ein bisschen größer ist ~ 30% größer im Speicherbedarf.
Meine Frage ist, was ist der Unterschied und welche Einstellung fehlt mir bei meiner Größenänderungsroutine, die für das hässlichere Ergebnis verantwortlich sein könnte. Ich möchte meine Resize-Routine dazu bringen, genau das gleiche Ergebnis wie die einfache Resize zu erzielen.
Ihre Hilfe wird sehr geschätzt. Dies ist mein erster Ausflug in die Bildverarbeitung.
EDIT
Einfache Resize (82KB)
simple http://img189.imageshack.us/img189/2137/simpleresize.jpg
My Resize (55KB)
complex http://img12.imageshack.us/img12/4023/complexresize.jpg
Die dst.Save (m, Format); sieht aus wie dein Problem. Sie kodieren es dort als jpeg, mit Standardqualität (nicht 100%), und dekodieren es dann sofort zu einem Bild zurück. dst ist bereits ein Image (Bitmap-Klasse erbt von Image), sodass Sie es einfach unverändert zurückgeben können. – David
Hallo David. Du hattest Recht. Mein Argument hinter diesem Schritt war, dass der Mimetyp Teil des resultierenden Bildes war. Ich speichere das Bild vorübergehend in der Sitzung und wollte es später abrufen können. Wenn Sie Ihre Antwort aktualisieren, markieren Sie sie als beantwortet. – madcapnmckay