Zusammenführen von zwei Bildern

Lesezeit: 4 Minuten

Zusammenfuhren von zwei Bildern
GuilhermeA

Ich muss zwei Bilder (BufferedImage) in Java zusammenführen. Es wäre kein Problem, wenn es keine Transparenz gäbe. Das Basisbild hat bereits etwas Transparenz. Ich möchte dies so lassen, wie es ist, und eine “Maske” darauf anwenden, das zweite Bild. Dieses zweite Bild hat keine undurchsichtigen Pixel, es ist tatsächlich fast vollständig transparent, hat nur einige weniger transparente Pixel, um eine Art “Lichteffekt” wie einen Reflex zu erzeugen. Wichtiges Detail: Ich möchte dies nicht auf dem Bildschirm tun, mit Grafiken muss ich ein BufferedImage mit der resultierenden Zusammenführung erhalten.

Kann mir jemand helfen? Danke!

DETAILS: Verschmelzen Sie zwei Bilder unter Beibehaltung der Transparenz. Das muss ich tun.

Hinweis: Diese Set BufferedImage-Alphamaske in Java macht nicht das, was ich brauche, da sie nicht gut mit den beiden Bildern mit Transparenz umgeht – sie ändert die erste Bildtransparenz.

Zusammenfuhren von zwei Bildern
Peter Walser

Erstellen Sie einfach ein neues BufferedImage mit Transparenz und malen Sie dann die anderen beiden Bilder (mit voller oder halber Transparenz) darauf. So wird es aussehen:

Bild plus Overlay

Beispielcode (Bilder heißen „image.png“ und „overlay.png“):

File path = ... // base path of the images

// load source images
BufferedImage image = ImageIO.read(new File(path, "image.png"));
BufferedImage overlay = ImageIO.read(new File(path, "overlay.png"));

// create the new image, canvas size is the max. of both image sizes
int w = Math.max(image.getWidth(), overlay.getWidth());
int h = Math.max(image.getHeight(), overlay.getHeight());
BufferedImage combined = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);

// paint both images, preserving the alpha channels
Graphics g = combined.getGraphics();
g.drawImage(image, 0, 0, null);
g.drawImage(overlay, 0, 0, null);

g.dispose();

// Save as new image
ImageIO.write(combined, "PNG", new File(path, "combined.png"));

  • Gibt es eine Möglichkeit, das zweite Bild in der Mitte des ersten zu haben?

    – Ahmed

    14. Januar 13 um 19:03 Uhr

  • Sollten Sie nicht g.dispose(); Am Ende?

    – m-szalik

    11. August 13 um 23:20 Uhr

  • Hallo, ich bin diesem Ansatz gefolgt und habe nur das zweite Bild gespeichert, aber nicht das erste Bild … Jede Hilfe hier wäre willkommen.

    – TP_JAVA

    23. April 15 um 15:34 Uhr


  • @Peter Das Bild wird ausgegraut, wenn ich die kombinierte Datei als JPEG-Datei richtig mache. Bitte helfen Sie

    – Mohammed Schebin

    14. November 17 um 9:43 Uhr

  • @Mohammedshebin verwende keine JPGs, sie sind anders und behandeln keine Transparenz

    – NimChimpsky

    19. Oktober 21 um 23:44 Uhr

Ich kann Ihnen keine konkrete Antwort geben, aber java.awt.AlphaComposite hier ist Ihr Freund. Sie haben die absolute Kontrolle darüber, wie die beiden Bilder zusammengeführt werden sollen. Es ist jedoch nicht einfach zu bedienen – Sie müssen zuerst ein wenig Grafiktheorie lernen.

Ohne mehr über den Effekt zu wissen, den Sie erreichen möchten, möchte ich nur darauf hinweisen, dass Sie auch direkt auf ein BufferedImage zeichnen können. Alles, was Sie auf dem Bildschirm tun könnten, können Sie also direkt auf dem Bild selbst tun.

Wenn Sie also nur eines über das andere ziehen möchten, ist das wirklich einfach. Nehmen Sie einfach das Graphics-Objekt für das Basisbild und zeichnen Sie das andere darauf.

Auch hier kann es je nach dem genauen Effekt, den Sie anstreben, möglicherweise nicht funktionieren. Mehr Details würden eine bessere Hilfe ermöglichen. Ist dies beispielsweise ein Job für AlphaComposite, wie der andere Responder erwähnt, oder ein benutzerdefiniertes ImageOp (oder eine Kombination bestehender ImageOps).

beliebige Dateitypen vertikal zusammenführen.

void mergeFiles(List<String> files, String fileName) {
        int heightTotal = 0;
        int maxWidth = 100;

        List<BufferedImage> images = new ArrayList<>();
        try {
            for (String file : files) {
                BufferedImage image = ImageIO.read(new File(file));
                images.add(image);
            }


        for (BufferedImage bufferedImage : images) {
            heightTotal += bufferedImage.getHeight();
            if (bufferedImage.getWidth() > maxWidth) {
                maxWidth = bufferedImage.getWidth();
            }
        }


        int heightCurr = 0;
        BufferedImage concatImage = new BufferedImage(maxWidth, heightTotal, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = concatImage.createGraphics();
        for (BufferedImage bufferedImage : images) {
            g2d.drawImage(bufferedImage, 0, heightCurr, null);
            heightCurr += bufferedImage.getHeight();
        }

        File compressedImageFile = new File(fileName);
        OutputStream outputStream = new FileOutputStream(compressedImageFile);

        float imageQuality = 0.7f;
        Iterator<ImageWriter> imageWriters = ImageIO.getImageWritersByFormatName("jpeg");

        if (!imageWriters.hasNext())
            throw new IllegalStateException("Writers Not Found!!");

        ImageWriter imageWriter = imageWriters.next();
        ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(outputStream);
        imageWriter.setOutput(imageOutputStream);

        ImageWriteParam imageWriteParam = imageWriter.getDefaultWriteParam();

        //Set the compress quality metrics
        imageWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
        imageWriteParam.setCompressionQuality(imageQuality);

        //Created image
        imageWriter.write(null, new IIOImage(concatImage, null, null), imageWriteParam);

        // close all streams
        outputStream.close();
        imageOutputStream.close();
        imageWriter.dispose();
        log.info(" Files Merged");
        } catch (IOException e) {
            log.error("Error while merging files :::"+e);
            throw new RuntimeException(e);
        }
    }

.

551540cookie-checkZusammenführen von zwei Bildern

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy