Unione di due immagini


84

Ho bisogno di unire due immagini (BufferedImage) in Java. Non sarebbe un problema se non ci fosse trasparenza. L'immagine di base ha già una certa trasparenza. Voglio mantenerlo così com'è e applicare una "maschera", la seconda immagine. Questa seconda immagine non ha pixel opachi, infatti è quasi completamente trasparente, ha solo alcuni pixel meno trasparenti per dare una sorta di "effetto luce", come un riflesso. Dettaglio importante: non voglio farlo sullo schermo, con la grafica, ho bisogno di ottenere una BufferedImage con l'unione risultante.

Qualcuno può aiutarmi? Grazie!

DETTAGLI: Unisci due immagini mantenendo la trasparenza. Questo è quello che devo fare.

Nota: questa maschera alfa Set BufferedImage in Java non fa ciò di cui ho bisogno perché non gestisce bene le due immagini che hanno la trasparenza - modifica la trasparenza della prima immagine.

Risposte:


181

Basta creare una nuova BufferedImage con trasparenza, quindi dipingere le altre due immagini (con trasparenza completa o semi-trasparente) su di essa. Ecco come apparirà:

Immagine più sovrapposizione

Codice di esempio (le immagini sono chiamate "image.png" e "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"));

C'è modo di avere la seconda immagine al centro della prima?
Ahmed

6
Non dovresti invocare g.dispose (); alla fine?
m-szalik

Ciao, ho seguito questo approccio e ho salvato solo la seconda immagine ma non la prima immagine ... Qualsiasi aiuto qui sarebbe apprezzato ..
TP_JAVA

@Peter L'immagine viene disattivata quando correggo il file combinato come file jpeg. Per favore
aiutatemi

3

Non posso darti una risposta specifica, ma java.awt.AlphaComposite qui è tuo amico. Avrai il controllo assoluto su come desideri che le due immagini si uniscano. Tuttavia non è semplice da usare: devi prima imparare un po 'di teoria grafica.


3

Senza saperne di più sull'effetto che stai cercando di ottenere, ti farò notare che puoi anche disegnare direttamente su una BufferedImage. Quindi qualsiasi cosa tu possa fare sullo schermo puoi farlo direttamente sull'immagine stessa.

Quindi, se tutto ciò che vuoi è disegnare uno sopra l'altro, è davvero facile. Basta afferrare l'oggetto Graphics per l'immagine di base e disegnare l'altro su di esso.

Ancora una volta, a seconda dell'effetto esatto che stai cercando, potrebbe non funzionare. Maggiori dettagli consentirebbero un aiuto migliore. Ad esempio, questo è un lavoro per AlphaComposite come cita l'altro risponditore o un ImageOp personalizzato (o una combinazione di ImageOps esistenti).


1

unisci verticalmente qualsiasi tipo di file.

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);
        }
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.