Java实现图片合成

功能

竖向合成多张大小不一致的图片,以最宽图片的为宽为合成后的宽度, 高为所有图片的总高度.图片宽度没有达到合成的宽度则填充部分使用白色画布填充.

代码

 /**
     * 多张图片进行竖向合并成一张图片
     * @param imageFiles 图片文件
     * @param dstPath 合成图片路径
     * @param hasLine 是否标识合成分割线
     * @return
     */
    public static boolean mergeImages(List<File> imageFiles, String dstPath, boolean hasLine) {
        try {
            Integer allWidth = 0;
            Integer allHeight = 0;
            List<BufferedImage> imgs = new ArrayList<>();
            for(int i = 0; i < imageFiles.size(); i++){
                imgs.add(ImageIO.read(imageFiles.get(i)));
                //取宽数据
                if (allWidth < imgs.get(i).getWidth()) {
                    allWidth = imgs.get(i).getWidth();
                }
                allHeight += imgs.get(i).getHeight();
            }
            BufferedImage combined = new BufferedImage(allWidth, allHeight, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = combined.createGraphics();
            g.setColor(Color.WHITE);
            g.fillRect(0, 0, allWidth, allHeight);
            // 竖向合成
            Integer height = 0;
            for(int i = 0; i < imgs.size(); i++){
                g.drawImage(imgs.get(i), 0, height, null);
                height +=  imgs.get(i).getHeight();
                if (hasLine && i != imgs.size() - 1) {
                    g.setColor(Color.RED);
                    //line需要占用一个像素,所以height-1才能保证不被后续的image覆盖
                    BasicStroke stroke = new BasicStroke(2.5f, BasicStroke.CAP_BUTT,
                            BasicStroke.JOIN_ROUND, 3.5f, new float[] { 10, 5 }, 0f);
                    g.setStroke(stroke);
                    g.drawLine(0, height - 1, allWidth, height - 1);
                }
            }

            ImageIO.write(combined, "jpg", new File(dstPath));
            System.out.println("===合成成功====");
        } catch (Exception e) {
            System.out.println("===合成失败====");
            System.out.println(StringUtil.exceptionToString(e));
            return false;
        }
        return true;
    }

测试效果: 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值