Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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.

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

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

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

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.

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!

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.