Heute zeige ich euch, wie man Bilder mit Hilfe des JPEG-Codecs beliebig komprimieren kann. Beliebig heißt in unserem Fall, dass ihr die Qualitätsstufe festlegen könnt, die das Bild trotz des Komprimierens beibehalten soll. Da die Funktion, die ich euch dafür geschrieben habe relativ kurz ist, denke ich, dass die Kommentare im Quelltext ausreichen sollten. Und nun viel Spaß damit!
private void JpegBildKomprimieren(Image quellBild, int qualitaet, string speicherPfad) { try { //Ein ImageCodecInfo-Objekt für den JPEG-Codec anlegen ImageCodecInfo jpegCodec = null; //Den Qualitätsarameter konfigurieren (Qualitätsfaktor in //Prozent angeben) EncoderParameter qualitaetsParameter = new EncoderParameter( System.Drawing.Imaging.Encoder.Quality, qualitaet); //Alle im System verfügbaren Codecs auflisten ImageCodecInfo[] alleCodecs = ImageCodecInfo.GetImageEncoders(); EncoderParameters codecParameter = new EncoderParameters(1); codecParameter.Param[0] = qualitaetsParameter; //Den JPEG-Codec unter allen Codecs finden und dem //Codec-Info-Objekt zuweisen for (int i = 0; i < alleCodecs.Length; i++) { if (alleCodecs[i].MimeType == "image/jpeg") { jpegCodec = alleCodecs[i]; break; } } //Das Bild abspeichern quellBild.Save(speicherPfad, jpegCodec, codecParameter); } catch (Exception e) { throw e; } } //Snippet von www.code-bude.net
Aufgerufen werden kann die Funktion zum Beispiel wie folgt:
JpegBildKomprimieren(Image.FromFile(Application.StartupPath + "\\bild.jpg"), 30, Application.StartupPath + "\\klein.jpg"); //Snippet von www.code-bude.net
Solltet ihr noch Fragen oder Probleme haben, so schreibt mir einfach einen Kommentar.
Viele Grüße,
Raffi
Deine Methode klappt wirklich super! Allerdings kann ich die quellbild.Save-Methode bei dem, was ich machen muss, nicht verwenden. Am liebsten hätte ich, dass aus der Komprimierungsmethode das komprimierte Bild zurückgegeben wird. Ist das irgendwie möglich?
Wieso kannst du die .Save()-Methode nicht nutzen? Geht es nicht oder willst du es nicht, da du keine Datei auf der Festplatte anlegen willst? Wenn es letzteres ist, dann kannst du das Bild auch einfach in einen MemoryStream statt in eine Datei schreiben. Siehe Beispiel hier: https://stackoverflow.com/a/7629892/251719