我想用Java合并4张图片

Rym*_*mes 2 java merge image awt image-processing

我很难理解如何在java中合并4张图片,我想将每张图片复制到合并后的图片中,重叠的20像素在50%合并中混合.为合并图像提供20像素边界,该边界是每个图像的适当部分的混合.

因此,一个4图像框,图像彼此混合20个像素.不知道我应该如何使用图像的宽度和高度,因为它非常混乱.

这样的东西.怎么做?

在此输入图像描述

Jus*_*tin 7

我从以下所有信息中获取:AlphaComposite,Compositing Graphics,Concatenating Images.

以下程序得到改进.它使用两种方法:joinHorizontaljoinVertical加入图像.在方法内部,会发生以下情况

  • 复制第二个图像,但只复制重叠的部分
  • 复制的图像设置为半个alpha(透明度)
  • 在'返回图像'的画布上,第一个图像被绘制,接着是第二个没有重叠部分的图像
  • 复制的图像绘制在画布上.
  • 图像被返回

为什么我只将一个图像设置为半个alpha而不是两个?

想象一下透明的玻璃窗:

在此输入图像描述

将随机点绘制成红色,使窗口的一半覆盖红色.现在,将带有红点的窗口视为新画布.

在此输入图像描述

将随机点涂成蓝色,以便新的"画布"覆盖一半蓝色.窗户不会被完全覆盖; 你仍然可以看透它.

在此输入图像描述

但是让我们想象一下,我们首先将窗口涂成红色,然后将其中的一半涂成蓝色.现在,它将是半蓝色和半红色,但根本不透明.

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;
    }

}
Run Code Online (Sandbox Code Playgroud)