将两个 BufferedImage 并排复制到一个图像中

Posted

技术标签:

【中文标题】将两个 BufferedImage 并排复制到一个图像中【英文标题】:Copy two BufferedImages into one image side by side 【发布时间】:2014-01-16 13:15:09 【问题描述】:

我有两张图片,我想将这两张图片复制到一张新图片中,其中第二张图片位于第一张图片的旁边,而不是在它上面。

BufferedImage imgb1 = img1;
BufferedImage imgb2 = img2;
BufferedImage imgResult = new BufferedImage(...);

其中imgResult 包含彼此相邻的第一张和第二张图片。

【问题讨论】:

1) What have you tried? 我的意思是除了问我们。 2) 为了尽快获得更好的帮助,请发布SSCCE。 3) 例如,获取图像的一种方法是热链接到this answer 中看到的图像。 4)请不要忘记添加“?”提问!有些人在页面中搜索“?”如果“问题”中不存在,则直接转到下一个(实际)问题。 【参考方案1】:
public static BufferedImage joinBufferedImage(BufferedImage img1,
      BufferedImage img2) 
    //int offset = 2;
    int width = img1.getWidth();
    int height = img1.getHeight() + img2.getHeight();
    BufferedImage newImage = new BufferedImage(width, height,
        BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2 = newImage.createGraphics();
    Color oldColor = g2.getColor();
    g2.setPaint(Color.WHITE);
    g2.fillRect(0, 0, width, height);
    g2.setColor(oldColor);
    g2.drawImage(img1, null, 0, 0);
    g2.drawImage(img2, null, 0, img1.getHeight());
    g2.dispose();
    return newImage;
  

修改了您的代码以将一张图像叠加打印(如一张接一张)

【讨论】:

【参考方案2】:

我为你创建了一个演示和一个单元测试,希望它有效!

代码:

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
 * This code try to join two BufferedImage
 * @author wangdq
 * 2013-12-29
 */
public class JoinImage 
    public static void main(String args[])
       
        String filename = System.getProperty("user.home")+File.separator;
        try 
            BufferedImage img1 = ImageIO.read(new File(filename+"1.png"));
            BufferedImage img2=ImageIO.read(new File(filename+"2.png"));
            BufferedImage joinedImg = joinBufferedImage(img1,img2);
            boolean success = ImageIO.write(joinedImg, "png", new File(filename+"joined.png"));
            System.out.println("saved success? "+success);
         catch (IOException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        
    
    /**
     * join two BufferedImage
     * you can add a orientation parameter to control direction
     * you can use a array to join more BufferedImage
     */

    public static BufferedImage joinBufferedImage(BufferedImage img1,BufferedImage img2) 

        //do some calculate first
        int offset  = 5;
        int wid = img1.getWidth()+img2.getWidth()+offset;
        int height = Math.max(img1.getHeight(),img2.getHeight())+offset;
        //create a new buffer and draw two image into the new image
        BufferedImage newImage = new BufferedImage(wid,height, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = newImage.createGraphics();
        Color oldColor = g2.getColor();
        //fill background
        g2.setPaint(Color.WHITE);
        g2.fillRect(0, 0, wid, height);
        //draw image
        g2.setColor(oldColor);
        g2.drawImage(img1, null, 0, 0);
        g2.drawImage(img2, null, img1.getWidth()+offset, 0);
        g2.dispose();
        return newImage;
    

【讨论】:

您使用Graphics2D 有什么原因吗?为什么不只是Graphics Graphics 没有setPaint 以任何方式改变到彼此之上而不是并排 @topcat3,类似这样,稍微算算一下,把图片排好。 @wangdq 是的,我现在已经做到了。如果有人想要解决方案,我可以在下面发布?

以上是关于将两个 BufferedImage 并排复制到一个图像中的主要内容,如果未能解决你的问题,请参考以下文章

如何从 R 中的数据子集创建两个并排图? [复制]

将两个 UIViewController 并排放在屏幕上

Autolayout :并排对齐两个按钮并在没有图像时移动到右侧

如何将一个 html 表格并排分成两部分?

如何缩放并排放置的两个图像?

将约束添加到并排按钮