Zum Inhalt springen

[C#] Bilder in vernünftiger Qualität skalieren/speichern


AnDi_P

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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..

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

post-56545-14430448821306_thumb.jpg

post-56545-14430448821678_thumb.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...