Frage

Ich müssen, um die Größe von PNG -, JPEG-und GIF-Dateien.Wie kann ich dies mithilfe von Java?

War es hilfreich?

Lösung

Nach dem Laden des Bildes können Sie versuchen:

BufferedImage createResizedCopy(Image originalImage, 
            int scaledWidth, int scaledHeight, 
            boolean preserveAlpha)
    {
        System.out.println("resizing...");
        int imageType = preserveAlpha ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
        BufferedImage scaledBI = new BufferedImage(scaledWidth, scaledHeight, imageType);
        Graphics2D g = scaledBI.createGraphics();
        if (preserveAlpha) {
            g.setComposite(AlphaComposite.Src);
        }
        g.drawImage(originalImage, 0, 0, scaledWidth, scaledHeight, null); 
        g.dispose();
        return scaledBI;
    }

Andere Tipps

FWIW Ich habe gerade (Apache 2, auf GitHub) eine einfache Bild-Skalierung Bibliothek für Java genannt imgscalr (auf Maven zentrale ).

Die Bibliothek implementiert ein paar verschiedene Ansätze zur Bildskalierung (einschließlich Chris Campbell stufenweisen Ansatz mit einigen kleinen Verbesserungen) und entweder den optimalen Ansatz für Sie wählen, wenn Sie es zu fragen, oder geben Sie die schnellste oder am besten aussehende (wenn Sie verlangen, dass).

Die Verwendung ist tot-einfach, nur ein Bündel von statischen Methoden. Der einfachste Anwendungsfall ist:

BufferedImage scaledImage = Scalr.resize(myImage, 200);

Alle Operationen halten die ursprünglichen Proportionen des Bildes, so dass in diesem Fall, dass Sie imgscalr fragen Sie Ihr Bild innerhalb Grenzen von 200 Pixel breit und 200 Pixel hoch und standardmäßig, um die Größe wird automatisch die Auswahl am besten aussehende und schnellste Ansatz für das da es nicht angegeben wurde.

ich am Anfang erkennen, das sieht aus wie Eigenwerbung (es ist), aber ich habe meinen gerechten Anteil an Zeit, um diese exakt gleichen Thema googeln und hielt mit unterschiedlichen Ergebnissen / Ansätze / Gedanken / Vorschläge kommen und beschlossen, sich zu setzen und schreiben Sie eine einfache Implementierung, dass 80-85% anwendungs~~POS=TRUNC ansprechen würde, wo Sie ein Bild haben, und wollen wahrscheinlich ein Vorschaubild für sie - entweder so schnell wie möglich oder wie gut aussehende wie möglich (für diejenigen, die versucht haben, Sie ‚ll Mitteilung eine Graphics.DrawImage sogar mit BICUBIC Interpolation zu einem kleinen genug Bild zu tun, es sieht immer noch wie Müll).

Thumbnailator ist ein Open-Source-Bildbibliothek für Java mit fließend Schnittstelle Ändern der Größe, verteilt unter der MIT-Lizenz

schrieb ich diese Bibliothek, weil es hochwertige Miniaturen in Java überraschend schwierig sein kann, und der resultierende Code könnte ziemlich chaotisch sein. Mit Thumbnailator ist es möglich, ziemlich komplizierte Aufgaben zum Ausdruck bringt eine einfache fließend API.

Ein einfaches Beispiel:

Für ein einfaches Beispiel, ein Bild zu nehmen und es zu 100 x 100 Ändern der Größe (das Seitenverhältnis des Originalbildes zu bewahren), und speichert sie auf eine Datei in einer einzigen Anweisung erreicht werden:

Thumbnails.of("path/to/image")
    .size(100, 100)
    .toFile("path/to/thumbnail");

Ein fortschrittliches Beispiel

Durchführen komplexe Redimensionierung Aufgaben mit Thumbnailator des fließend Schnittstelle vereinfacht.

Nehmen wir an, wir folgendes tun:

  1. nimmt die Bilder in einem Verzeichnis und
  2. Größe ändern auf 100 x 100, mit dem Seitenverhältnis des Originalbildes,
  3. , sie alle zu JPEGs mit Qualitätseinstellungen von 0.85 speichern,
  4. , wobei die Dateinamen aus dem Original mit thumbnail. zu Beginn beigefügten genommen werden

übersetzt auf Thumbnailator, würden wir in der Lage sein, die oben mit dem folgenden ausführen:

Thumbnails.of(new File("path/to/directory").listFiles())
    .size(100, 100)
    .outputFormat("JPEG")
    .outputQuality(0.85)
    .toFiles(Rename.PREFIX_DOT_THUMBNAIL);

Ein Hinweis über die Bildqualität und Geschwindigkeit

Diese Bibliothek verwendet auch die progressive bilineare Skalierung Methode in Filthy Rich Clients von Chet Haase und Romain Guy in um qualitativ hochwertige Thumbnails zu erzeugen, während akzeptable Laufzeit-Performance zu gewährleisten.

Sie brauchen keine Bibliothek, dies zu tun. Sie können es mit Java selbst.

Chris Campbell verfügt über eine hervorragende und detaillierte Zuschreibung auf Skalieren von Bildern - siehe dieser Artikel .

Chet Haase und Romain Guy haben auch eine detaillierte und sehr informativ Zuschreibung von Bildskalierung in ihrem Buch Filthy Rich Clients .

Java Advanced Imaging ist jetzt Open Source und stellt die Operationen, die Sie benötigen.

Wenn Sie mit großen Bildern zu tun oder wollen ein schönes Ergebnis suchen, es ist keine triviale Aufgabe in Java. Tun Sie es einfach über einen rescale op über Graphics2D wird keine hohe Qualität Thumbnail erstellen. Sie können es tun JAI verwenden, aber es erfordert mehr Arbeit, als Sie sich vorstellen würden, etwas zu bekommen, das gut aussieht und JAI hat die unangenehme Angewohnheit, mit OutOfMemory Fehler unserer JVM blasen.

Ich schlage vor, ImageMagick als externe ausführbare Datei verwenden, wenn Sie damit durchkommen können. Seine einfach zu bedienen und es macht den Job richtig, so dass Sie nicht haben.

Wenn imagemagick auf Ihrer Maschine installiert ist eine Option, ich empfehle im4java . Es ist eine sehr dünne Abstraktionsschicht auf der Befehlszeilenschnittstelle, sondern macht seinen Job sehr gut.

Der Java-API bietet keine Standard-Skalierungsfunktion für Bilder und Herabstufung Bildqualität.

Aus diesem Grunde habe ich versucht, cvResize von JavaCV zu verwenden, aber es scheint, Probleme zu verursachen.

fand ich eine gute Bibliothek für Bildskalierung: einfach die Abhängigkeit hinzufügen für „java-Bild-Skalierung“ in Ihrem pom.xml.

<dependency>
    <groupId>com.mortennobel</groupId>
    <artifactId>java-image-scaling</artifactId>
    <version>0.8.6</version>
</dependency>

In der Maven-Repository finden Sie die aktuelle Version für diese.

Ex. In Ihrem Java-Programm

ResampleOp resamOp = new ResampleOp(50, 40);
BufferedImage modifiedImage = resamOp.filter(originalBufferedImage, null);

Sie könnten versuchen, -System GraphicsMagick Bildverarbeitung verwenden mit im4java als comand Zeilen-Schnittstelle für Java.

Es gibt viele Vorteile von GraphicsMagick, aber einer für alle:

  • wird GM verwendet Milliarden zu verarbeiten Dateien auf der größten Foto der Welt Websites (zum Beispiel Flickr und Etsy).

Image Magick erwähnt wurde.Gibt es eine JNI-front-end-Projekt namens JMagick.Es ist nicht besonders stabil Projekt (Bild Magick sich bekannt zu ändern, eine Menge und den break-even-Kompatibilität).Das heißt, wir haben hatte gute Erfahrung mit JMagick und eine kompatible version von Image Magick in einer Produktionsumgebung durchführen Skalierung bei hohem Durchsatz, niedriger Latenz-rate.Geschwindigkeit war wesentlich besser als mit einem all Java-Grafik-Bibliothek, die wir bisher ausprobiert habe.

http://www.jmagick.org/index.html

Einfach Burkhard Antwort verwenden, aber diese Zeile hinzufügen, nachdem die Erstellung von Grafiken:

    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

Sie auch den Wert auf BICUBIC einstellen könnten, wird es eine bessere Bildqualität produzieren, sondern ist ein teurer Betrieb. Es gibt noch andere Rendering Hinweise Sie einstellen können, aber ich habe festgestellt, dass Interpolation die bemerkenswerteste Wirkung erzeugt. Denken Sie daran, wenn Sie in einer Menge, Java-Code vergrößern wollen höchstwahrscheinlich sein werden sehr langsam. Ich finde, größere Bilder liegen um 300% Zoom zu produzieren beginnen sogar mit allen Rendering Hinweisen Set für Geschwindigkeit über Qualität zu optimieren.

Sie können Marvin verwenden (reine Java-Bildverarbeitungs-Framework) für diese Art von Operation:   http://marvinproject.sourceforge.net

Scale-Plug-in: http://marvinproject.sourceforge.net/en/plugins/scale.html

Es stellt sich heraus, dass ein performanten Scaler Schreiben nicht trivial ist. Ich habe es einmal für ein Open-Source-Projekt: ImageScaler .

Im Prinzip 'java.awt.Image # getScaledInstance (int, int, int)' würde auch die Arbeit tun, aber es ist ein übler Bug mit diesem -. Beziehen sich auf meine Verbindung für Details

Ich habe eine Lösung mit den frei verfügbaren Klassen (AnimatedGifEncoder, GifDecoder und LWZEncoder) verfügbar für den Umgang mit GIF-Animation entwickelt.
Sie können die jgifcode jar herunterladen und die GifImageUtil Klasse laufen. Link: http://www.jgifcode.com

Sie können folgende beliebtes Produkt verwenden: thumbnailator

Wenn Sie nicht wollen, importieren imgScalr wie @Riyad Kalla Antwort, über das ich auch getestet funktioniert gut , du kannst das von Peter Walser Antwort genommen @ Peter Walser auf ein anderes Problem aber:

 /**
     * utility method to get an icon from the resources of this class
     * @param name the name of the icon
     * @return the icon, or null if the icon wasn't found.
     */
    public Icon getIcon(String name) {
        Icon icon = null;
        URL url = null;
        ImageIcon imgicon = null;
        BufferedImage scaledImage = null;
        try {
            url = getClass().getResource(name);

            icon = new ImageIcon(url);
            if (icon == null) {
                System.out.println("Couldn't find " + url);
            }

            BufferedImage bi = new BufferedImage(
                    icon.getIconWidth(),
                    icon.getIconHeight(),
                    BufferedImage.TYPE_INT_RGB);
            Graphics g = bi.createGraphics();
            // paint the Icon to the BufferedImage.
            icon.paintIcon(null, g, 0,0);
            g.dispose();

            bi = resizeImage(bi,30,30);
            scaledImage = bi;// or replace with this line Scalr.resize(bi, 30,30);
            imgicon = new ImageIcon(scaledImage);

        } catch (Exception e) {
            System.out.println("Couldn't find " + getClass().getName() + "/" + name);
            e.printStackTrace();
        }
        return imgicon;
    }

 public static BufferedImage resizeImage (BufferedImage image, int areaWidth, int areaHeight) {
        float scaleX = (float) areaWidth / image.getWidth();
        float scaleY = (float) areaHeight / image.getHeight();
        float scale = Math.min(scaleX, scaleY);
        int w = Math.round(image.getWidth() * scale);
        int h = Math.round(image.getHeight() * scale);

        int type = image.getTransparency() == Transparency.OPAQUE ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;

        boolean scaleDown = scale < 1;

        if (scaleDown) {
            // multi-pass bilinear div 2
            int currentW = image.getWidth();
            int currentH = image.getHeight();
            BufferedImage resized = image;
            while (currentW > w || currentH > h) {
                currentW = Math.max(w, currentW / 2);
                currentH = Math.max(h, currentH / 2);

                BufferedImage temp = new BufferedImage(currentW, currentH, type);
                Graphics2D g2 = temp.createGraphics();
                g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
                g2.drawImage(resized, 0, 0, currentW, currentH, null);
                g2.dispose();
                resized = temp;
            }
            return resized;
        } else {
            Object hint = scale > 2 ? RenderingHints.VALUE_INTERPOLATION_BICUBIC : RenderingHints.VALUE_INTERPOLATION_BILINEAR;

            BufferedImage resized = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2 = resized.createGraphics();
            g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, hint);
            g2.drawImage(image, 0, 0, w, h, null);
            g2.dispose();
            return resized;
        }
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top