Je veux fusionner 4 images ensemble en Java


J'ai du mal à comprendre comment fusionner 4 images ensemble en java, je veux copier chaque image dans l'image fusionnée avec les 20 pixels qui se chevauchent mélangés dans une fusion à 50%. Pour donner à l'image fusionnée une limite de 20 pixels qui est un mélange de la partie appropriée de chaque image.

Donc une boîte de 4 images avec les images mélangées les unes dans les autres par 20 pixels. Je ne sais pas comment je devrais utiliser la largeur et la hauteur des images car c'est très déroutant.

Quelque Chose comme ce. Comment faire?

entrez la description de l'image ici

Author: Andrew Thompson, 2013-04-19

1 answers

J'ai toutes mes infos: AlphaComposite, la Composition Graphique, la Concaténation d'Images.

Le programme suivant est amélioré. Il utilise deux méthodes: joinHorizontal et joinVertical joindre les images. À l'intérieur des méthodes, ce qui suit se produit

  • la deuxième image est copiée, mais seulement la partie qui chevauche
  • l'image copiée est définie sur la moitié alpha (transparence)
  • sur la toile du "retour d'image", la première image est peinte, suivie par la deuxième sans la partie qui se chevauche
  • l'image copiée est peinte sur la toile.
  • l'image est retournée

Pourquoi ne définir qu'une seule image à la moitié alpha et pas les deux?

Imaginez une fenêtre en verre claire:

entrez la description de l'image ici

Peignez les points aléatoires en rouge de sorte que la moitié de la fenêtre soit recouverte de rouge. Maintenant, traitez la fenêtre avec les points rouges comme votre nouvelle toile.

entrez la description de l'image ici

Peindre des points aléatoires en bleu pour que la nouvelle "toile" soit à moitié recouverts de bleu. La fenêtre ne sera pas complètement couverte; vous pourrez toujours voir à travers elle.

entrez la description de l'image ici

Mais imaginons que nous avons d'abord peint la fenêtre en rouge, puis peint la moitié en bleu. Maintenant, ce sera moitié bleu et moitié rouge, mais pas du tout transparent.

public class ImageMerger {

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        BufferedImage img1 = //some code here
        BufferedImage img2 = //some code here
        BufferedImage img3 = //some code here
        BufferedImage img4 = //some code here

        int mergeWidth = 20; // pixels to merge.
        BufferedImage merge =  ImageMerger.joinVertical(
                ImageMerger.joinHorizontal(img1, img2, mergeWidth),
                ImageMerger.joinHorizontal(img3, img4, mergeWidth),mergeWidth);

        //do whatever you want with merge. gets here in about 75 milliseconds

    }

    public static BufferedImage joinHorizontal(BufferedImage i1, BufferedImage i2, int mergeWidth){
        if (i1.getHeight() != i2.getHeight()) throw new IllegalArgumentException("Images i1 and i2 are not the same height");

        BufferedImage imgClone = new BufferedImage(mergeWidth, i2.getHeight(), BufferedImage.TYPE_INT_ARGB);
        Graphics2D cloneG = imgClone.createGraphics();
        cloneG.drawImage(i2, 0, 0, null);
        cloneG.setComposite(AlphaComposite.getInstance(AlphaComposite.DST_IN, 0.5f));
        cloneG.drawImage(i2, 0, 0, null);

        BufferedImage result = new BufferedImage(i1.getWidth() + i2.getWidth() 
                - mergeWidth, i1.getHeight(), BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = result.createGraphics();
        g.drawImage(i1, 0, 0, null);
        g.drawImage(i2.getSubimage(mergeWidth, 0, i2.getWidth() - mergeWidth,
                i2.getHeight()), i1.getWidth(), 0, null);
        g.drawImage(imgClone, i1.getWidth() - mergeWidth, 0, null);

        return result;
    }
    public static BufferedImage joinVertical(BufferedImage i1, BufferedImage i2, int mergeWidth){
        if (i1.getWidth() != i2.getWidth()) throw new IllegalArgumentException("Images i1 and i2 are not the same width");

        BufferedImage imgClone = new BufferedImage(i2.getWidth(), mergeWidth, BufferedImage.TYPE_INT_ARGB);
        Graphics2D cloneG = imgClone.createGraphics();
        cloneG.drawImage(i2, 0, 0, null);
        cloneG.setComposite(AlphaComposite.getInstance(AlphaComposite.DST_IN, 0.5f));
        cloneG.drawImage(i2, 0, 0, null);

        BufferedImage result = new BufferedImage(i1.getWidth(), 
                i1.getHeight() + i2.getHeight() - mergeWidth, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = result.createGraphics();
        g.drawImage(i1, 0, 0, null);
        g.drawImage(i2.getSubimage(0, mergeWidth, i2.getWidth(),
                i2.getHeight() - mergeWidth), 0, i1.getHeight(), null);
        g.drawImage(imgClone, 0, i1.getHeight() - mergeWidth, null);

        return result;
    }

}
 6
Author: Justin, 2013-04-23 05:06:04