【问题标题】:I want to merge 4 pictures together in Java我想在Java中将4张图片合并在一起
【发布时间】:2013-04-12 03:15:30
【问题描述】:

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

因此,一个 4 图像框,其中图像相互混合 20 像素。不知道我应该如何使用图像的宽度和高度,因为它非常令人困惑。

类似于this。怎么做?

【问题讨论】:

  • 上传一张你想要的图片可能会有所帮助
  • @gangqinlaohu 刚刚提供了一个链接,其中包含我希望通过混合创建的图像类型
  • 使用 alpha 合成,如 here 所示。
  • 在那里,我完成了我承诺的编辑。在你使用它之前,请试着理解我做了什么。
  • 使用它,复制合并2张图片,对你有好处stackoverflow.com/a/2319251/2458232

标签: java image image-processing merge awt


【解决方案1】:

我的所有信息来自:AlphaCompositeCompositing GraphicsConcatenating 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;
    }

}

【讨论】:

    猜你喜欢
    • 2013-03-05
    • 2011-11-04
    • 2016-03-31
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    相关资源
    最近更新 更多