AnDi_P Geschrieben 12. Oktober 2010 Geschrieben 12. Oktober 2010 Hallo zusammen, ich habe ein kleines Programm beschrieben, mit dem ich ganz komfortabel viele Bilder schnell auf eine bestimmte Größe skalieren kann. Hier einmal die Methode, die ich zum Skalieren/speichern benutze private void ScaleImage(string filename) { string imagePath = labelPath.Text + filename; int width = Convert.ToInt32(textBoxWidth.Text); int height = Convert.ToInt32(textBoxHeight.Text); Bitmap orgImage = new Bitmap(imagePath); // Bitmap aus Org-Datei erstellen Bitmap newImage = new Bitmap(width, height); // Ziel-Bitmap mit übergebener Größe erstellen Graphics tempGraphic = Graphics.FromImage(newImage); // Zwischenobjekt für Skalierung tempGraphic.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; tempGraphic.DrawImage(orgImage, 0, 0, width, height); // Graphics-Objekt mit übergebenen Werten skalieren string newName = Path.GetFileNameWithoutExtension(imagePath) + "_scaled.jpg"; // Neuer Dateiname newImage.Save("D:\\" + newName, System.Drawing.Imaging.ImageFormat.Jpeg); // Neues Bitmap als JPEG abspeichern orgImage.Dispose(); // Ressourcen wieder freigeben newImage.Dispose(); tempGraphic.Dispose(); } Nun habe ich allerdings das Problem, dass meine kleiner skalierten Bilder eine schlechtere Qualität (unscharf) haben, als wenn ich z.B. das gleiche Bild mit Paint herunterskaliere. Habt ihr Tipps, wie ich die Qualität noch weiter steigern kann? Mein gewählter "InterpolationMode" ist der, der die beste Qualität aufwies. Ebenfalls habe ich noch das kleine Problem, dass ich keine Bilder auf die C: Partition abspeichern kann. Dabei kommt es immer zu einer "ExternalException". Das speichern auf eine andere Partition klappt ohne Probleme. Ich vermute nun, dass das mit dem Windows 7 Rechtesystem zusammenhängt. Aber wieso können andere Programm direkt auf C: speichern? Ich hoffe Ihr könnte mir ein paar Tipps geben. In der Forensuche und bei Dr. Google habe ich nichts passendes gefunden. MfG, AnDi_P Zitieren
AnDi_P Geschrieben 13. Oktober 2010 Autor Geschrieben 13. Oktober 2010 Hallo nochmal, habe mittlerweile wieder ein bisschen rumgetestet, und festgestellt, dass wenn ich bei der Save-Methode des Graphics-Objekts, das ImageFormat "JPEG" nicht angebe, die Bilder auf jeden Fall eine bessere Qualität haben - allerdings auch wesentlich größer sind. Also scheint der Qualitätsverlust zumindest wohl mit der JPEG-Komprimierung zu tun zu haben. Zitieren
2K1.INC Geschrieben 14. Oktober 2010 Geschrieben 14. Oktober 2010 hey, ich hab mal 2 projekte geschrieben die mit Bitmaps zu tun hattn eins war um Screenshots zu machen einzeln oder in bestimmten zeitabständen und das andere war um Bilder anzuzeigen und in miniaturbilder zu speichern und drehn etc... nix wirklich großes aber vll würdn dir die neue möglichkeiten/ideen etc bringen um dein programm zu erweitern/verbessern und was weis ich ned alles.. Zitieren
AnDi_P Geschrieben 14. Oktober 2010 Autor Geschrieben 14. Oktober 2010 Hi, erstmal danke für Deine Antwort! Also das speichern und skalieren der Dateien ist überhaupt kein Problem. Es geht mir wirklich nur um die Qualitätsunterschiede die ich habe, wenn ich ein Bild einmal mit meinem Programm skaliere und einmal mit Paint. Die Bilder von Paint sind dort wesentlich schärfer. Habe mittlerweile gelesen, dass man scheinbar mit einer Bilddrehung beim Abspeichern keine Qualitätsverluste haben soll. Allerdings ging es bei diesen Beispielen nur z.B. um das Hinzufügen von Exif-Daten und dann abspeichern, und nicht um die Skalierung. Solltest Du dafür irgendwelche Beispiele haben, oder weitere Lösungsansätze zu einer besser Qualität, wäre ich Dir sehr dankbar! MfG Andi_P Zitieren
2K1.INC Geschrieben 14. Oktober 2010 Geschrieben 14. Oktober 2010 ne sry dafür direkt hab ich keine, aber schau mal bei sourceforge.net oder codeprojekt.com die haben immer gute beispsiele vll findest du da was Zitieren
Klotzkopp Geschrieben 14. Oktober 2010 Geschrieben 14. Oktober 2010 Das JPEG-Format beinhaltet eine verlustbehaftete Komprimierung. Dabei kann man einstellen, ob man weniger Verluste oder eine geringere Größe haben will: How to: Set JPEG Compression Level Zitieren
AnDi_P Geschrieben 14. Oktober 2010 Autor Geschrieben 14. Oktober 2010 Danke für deine Antwort. Den Code aus deinem Link hatte ich bereits bei mir implementiert (aus einem anderen Beispiel). Die Qualität ist zwar schon nicht schlecht, allerdings sieht das bei Paint deutlich schärfer aus. Bzgl. der Bilddrehung: Transforming a JPEG Image Without Loss of Information (Windows) Wenn ich das richtig interpretiere, sollen da halt bei der Drehung keine Informationen verloren gehen. Konnte leider nur den Microsoft C++ Code nicht 100%ig an meinen C# Code anpassen, so dass ich die Drehung UND zusätzlich die extra Qualitätseinstellungen habe. Habe mal im Anhang eine Skalierung eines Bildes in Paint, und einmal mit meinem Programm. Auch sieht man, dass das Ergebnis bei Paint nur halb so groß ist. Wenn mir jetzt jemand sagt, dass das halt bei Paint spezielle Libraries sind, und daher die Qualität besser ist, ist das auch ok. Ich möchte halt nur das Beste aus meinem Programm herausholen, auch zu Lernzwecken. Zitieren
FinalFantasy Geschrieben 14. Oktober 2010 Geschrieben 14. Oktober 2010 Also nach Ansicht deiner Bilder würde ich eher sagen, dass das Bild von Paint schlechter ist, da überschärft und pixeliger. Habe eher den Eindruck, dass die Paintvariante nur pixelresized ist. Deines sieht eher nach bilinear oder sogar bicubic aus, was deutlich bessere Ergebnisse bringt. Was das Laden und Speichern ohne Qualitätsverlust angeht: Ohne diese spezielle Optimierung hast du sogar einen Qualitätsverlust, wenn du lädst, NICHT tust und wieder speicherst. Beim Laden wird aus dem komprimierten JPEG ja wieder eine Bitmap erstellt, die natürlich die Qualitätsverluste aus dem JPEG schon enthält. Wenn du jetzt wieder speicherst, wird diese schon verlustbehaftete Bitmap ja nochmal JPEG-Komprimiert. Für Drehen gibt es spezielle Algorithmen, die das ohne Qualitätsverlust hinkriegen (liegt an der Art und Weise, wie JPEG funktioniert), aber selbst das funktioniert nur in 90° Schritten. Für Ändern von Exif Infos änderst du das Bild nicht, das kannst du sogar machen, ohne das Bild überhaupt zu laden. Was die unterschiedliche Größe angeht, ist sicher auch der Komprimierungslevel ausschlaggebend. Natürlich erziehlt JPEG auch abhängig vom Ausgangsmaterial unterschiedliche Ergebnisse in der Kompression. Es kann durchaus sein, dass bei Paint durch die Überschärfe die Komprimierung besser greift und deshalb die Dateien kleiner werden. Zitieren
AnDi_P Geschrieben 15. Oktober 2010 Autor Geschrieben 15. Oktober 2010 Also nach Ansicht deiner Bilder würde ich eher sagen, dass das Bild von Paint schlechter ist, da überschärft und pixeliger. Habe eher den Eindruck, dass die Paintvariante nur pixelresized ist. Deines sieht eher nach bilinear oder sogar bicubic aus, was deutlich bessere Ergebnisse bringt. Ja, mit dem Bicubic hast du Recht. Okay, scheint dann wohl eher mein eigener subjektiver Eindruck zu sein, dass das Paint-Bild besser aussieht. Ich denke dann sollte diese Sache erstmal für mich erledigt sein. Vielen Dank! Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.