Arbeiten mit Bildern in Java: Größenänderung und Zuschnitt (resize, crop)
\n\nIn der modernen Entwicklung von Webanwendungen und Desktop-Programmen besteht häufig die Notwendigkeit, Grafikdateien zu verarbeiten. Java bietet ein leistungsstarkes integriertes Toolkit für die Arbeit mit Bildern, ohne dass die Installation von Drittanbieter-Bibliotheken erforderlich ist. In diesem Artikel werden wir zwei grundlegende Operationen im Detail besprechen: Größenänderung (resize) und Zuschnitt (crop) von Bildern unter Verwendung der Standardklassen javax.imageio und java.awt.
Wichtige Java-Klassen für die Bildverarbeitung
\n\nBevor wir zu den Beispielen übergehen, machen wir uns mit den Hauptkomponenten der Java 2D API vertraut, die für die Arbeit benötigt werden:
\n\n- \n
BufferedImage— die Hauptklasse zur Darstellung eines Bildes mit Zugriff auf die Pixel. \n Graphics2D— der Zeichenkontext, der Transformationen, Skalierung und Zeichnen ermöglicht. \n AffineTransform— die Klasse für affine Transformationen (Skalierung, Drehung, Verschiebung). \n ImageIO— eine Dienstprogrammklasse zum Lesen und Schreiben von Bildern in verschiedenen Formaten (JPEG, PNG, BMP usw.). \n
Alle diese Klassen sind im Standard-JDK-Lieferumfang enthalten, sodass für ihre Verwendung keine zusätzlichen Abhängigkeiten (Maven/Gradle) erforderlich sind.
\n\n1. Größenänderung eines Bildes (resize)
\n\nDie Operation der Größenänderung (Skalierung) kann auf zwei Hauptarten durchgeführt werden: mit Graphics2D (die flexibelste Methode) oder über AffineTransformOp (für eine genauere Kontrolle der Interpolation). Wir werden beide Ansätze betrachten.
Methode 1: Über Graphics2D (für die meisten Aufgaben empfohlen)
\n\nDiese Methode eignet sich, wenn Sie schnell die Größe unter Beibehaltung der Qualität ändern müssen. Wir zeichnen das Originalbild auf eine neue BufferedImage-Leinwand mit der gewünschten Größe.
import java.awt.*;\nimport java.awt.image.BufferedImage;\nimport java.io.File;\nimport javax.imageio.ImageIO;\n\npublic class ImageResizer {\n\n public static BufferedImage resize(BufferedImage originalImage, int targetWidth, int targetHeight) {\n // Erstellt ein neues Bild mit den angegebenen Abmessungen und dem Typ RGB\n BufferedImage resizedImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB);\n \n // Holt den Zeichenkontext\n Graphics2D graphics2D = resizedImage.createGraphics();\n \n // Aktiviert Anti-Aliasing für ein qualitativ hochwertigeres Ergebnis\n graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);\n graphics2D.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);\n graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);\n \n // Zeichnet das Originalbild, skaliert es auf die neuen Abmessungen\n graphics2D.drawImage(originalImage, 0, 0, targetWidth, targetHeight, null);\n graphics2D.dispose(); // Gibt Ressourcen frei\n \n return resizedImage;\n }\n\n public static void main(String[] args) throws Exception {\n // Liest das Originalbild\n BufferedImage original = ImageIO.read(new File("input.jpg"));\n \n // Ändert die Größe auf 800x600 Pixel\n BufferedImage resized = resize(original, 800, 600);\n \n // Speichert das Ergebnis\n ImageIO.write(resized, "jpg", new File("output_resized.jpg"));\n System.out.println("Bild geändert und gespeichert.");\n }\n}\n\nWichtig: Verwenden Sie RenderingHints, um die Qualität zu verbessern. VALUE_INTERPOLATION_BILINEAR bietet eine gute Balance zwischen Geschwindigkeit und Qualität, während VALUE_INTERPOLATION_BICUBIC die maximale