Java - JPEG laden, verkleinern, speichern

nils_eckert

Grünschnabel
Hallo zusammen,

wir müssen für die Uni ein Projekt machen, in dem wir unter anderem JPEGs verkleinern müssen (ne Galerie).

Ich suche jetzt also ein Möglichkeit, wie z.B. bei der GD-Lib in PHP JPEGs mit Verschiedenen Qualitäten verkleinern zu können.

Für alle Tips wäre ich dankbar.

Viele Grüße,
Nils
 
Hallo!

Schau mal hier:
Code:
package de.tutorials.test;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

public class Test48 {

	public static void main(String[] args) {
		try {
			Image img = new ImageIcon(ImageIO.read(new File("c:/Beispiel.jpg")))
					.getImage();
			System.out.println(img.getWidth(null));
			System.out.println(img.getHeight(null));

			int wNew = 120, hNew = 90;

			Image scaledImage = img.getScaledInstance(wNew, hNew,
					Image.SCALE_SMOOTH);

			BufferedImage outImg = new BufferedImage(wNew, hNew,
					BufferedImage.TYPE_INT_RGB);
			Graphics g = outImg.getGraphics();
			g.drawImage(scaledImage, 0, 0, null);
			g.dispose();

			ImageIO.write(outImg, "jpeg", new File("c:/Beispiel_small.jpg"));

		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}

Schneller gehts wenn man das Image über graphics.drawImage(image,newWidth,newHeight,null) zeichnet...
Siehe auch hier:
http://www.tutorials.de/forum/java/...sser-graphics-drawimage-verwenden-sollte.html

Gruß Tom
 
Hellas!

Hab den Code von Thomas in meinem neuen Programm verwendet, das läuft inzwischen auch. Trotzdem kommt es mir vor, als könnten die verkleinerten und gespeicherten Bilder eine bessere Qualität haben. Gibt es hier evtl. Lösungsansätze? zB JPEG bietet doch verschiedene Qualitätstufen (0-100), kann man diese Ansprechen?

lg Billie
 
Hallo!

Schau mal hier:
Code:
package de.tutorials;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;

import javax.imageio.ImageIO;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class JPEGCompressionExample {
    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        BufferedImage image = ImageIO.read(new File("c:/Wasserlilien.jpg"));

        JPEGImageEncoder jpegImageEncoder = JPEGCodec
                .createJPEGEncoder(new FileOutputStream(
                        "c:/Wasserlilien_low.jpg"));
        JPEGEncodeParam param = jpegImageEncoder
                .getDefaultJPEGEncodeParam(image);
        param.setQuality(0.5F, true);
        jpegImageEncoder.encode(image, param);
    }
}

Gruß Tom
 
Vielen Dank! Seh mir das bei Gelegenheit an, aber bin mir sicher, dass ich das verwenden kann.

Nur noch eine andere, kleine Frage... warum gibt es standardmäßig keine Dokumentation zu den com.sun.* Klassen?! In diesen Klassen sind viele nützliche Dinge versteckt, aber woher soll man wissen, dass es sie gibt? Hatte das Problem schoneinmal mit Base64-De/Encoder ... gibt es in diesen Klassen auch schon.

lg Billie
 
Hallo!

Die com.sun....* Klassen sind eigentlich auch nicht fuer den oeffentlichen Gebrauch gedacht... weiterhin ist nicht garantiert, dass diese Klassen auch bei anderen JVM Herstellern vorhanden sind.

Hier eine Version ohne, com.sun....* Klassen:
Code:
package de.tutorials;

import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Iterator;
import java.util.Locale;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;

public class JPEGCompressionExample {
    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        BufferedImage image = ImageIO.read(new File("c:/Winter_big.jpg"));
        Iterator iterator = ImageIO.getImageWritersBySuffix("jpeg");
        ImageWriter imageWriter = (ImageWriter) iterator.next();
        JPEGImageWriteParam imageWriteParam = new JPEGImageWriteParam(Locale
                .getDefault());
        imageWriteParam.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
        imageWriteParam.setCompressionQuality(0.5F);
        IIOImage iioImage = new IIOImage(image, null, null);
        imageWriter.setOutput(ImageIO.createImageOutputStream(new File(
                "c:/Winter_big_low.jpg")));
        imageWriter.write(null, iioImage, imageWriteParam);
    }
}

Gruss Tom
 
Neues Problem, mit dieser neuen Speicher-Methode bekomme ich keinen Output mehr auf meine Http-Verbindung.

Also das funktioniert:

Code:
// fc = javax.jnlp.FileContents (JavaWebStart)
imageWriter.setOutput(ImageIO.createImageOutputStream(fc[i].getOutputStream(true)));
        imageWriter.write(null, iioImage, imageWriteParam);

Aber ich will die Datei ja nicht überschreiben, sondern an den Server über die Verbindung schiecken und das funktioniert nicht, obwohl die Verbindung steht (EchoServer meldet Verbindung hergestellt, verbindung wieder geschlossen).

Code:
ByteArrayOutputStream byteStream = new ByteArrayOutputStream(512);

imageWriter.setOutput(ImageIO.createImageOutputStream(byteStream));
imageWriter.write(null, iioImage, imageWriteParam);

byteStream.writeTo(connection.getOutputStream());

Oder auch...

Code:
HttpURLConnection connection = (HttpURLConnection) url.openConnection();

imageWriter.setOutput(ImageIO.createImageOutputStream(connection.getOutputStream()));
imageWriter.write(null, iioImage, imageWriteParam);

Wo liegt hier der Hund begraben?
 
Hallo!

Schau mal hier:
Code:
package de.tutorials.test;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

public class Test48 {

	public static void main(String[] args) {
		try {
			Image img = new ImageIcon(ImageIO.read(new File("c:/Beispiel.jpg")))
					.getImage();
			System.out.println(img.getWidth(null));
			System.out.println(img.getHeight(null));

			int wNew = 120, hNew = 90;

			Image scaledImage = img.getScaledInstance(wNew, hNew,
					Image.SCALE_SMOOTH);

			BufferedImage outImg = new BufferedImage(wNew, hNew,
					BufferedImage.TYPE_INT_RGB);
			Graphics g = outImg.getGraphics();
			g.drawImage(scaledImage, 0, 0, null);
			g.dispose();

			ImageIO.write(outImg, "jpeg", new File("c:/Beispiel_small.jpg"));

		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}

Gruß Tom


Guten Morgen!

ich hab mal versucht dieses Programm bei mir zum Laufen zu kriegen. Ich benutze einen Javaeditor und habe auch meine Classpath und Path Pfade in die Umgebungsvariablen geschrieben. Doch ich kriege immer noch einen "java.lang.NoClassDefFoundError" Fehler. Kann mir jemand bei diesem Fehler weiterhelfen?

Mfg
Volker
 
Zurück