Java 实现图片合成 (com.google.zxing)

以下述伪需求为例,进行Java P图的展示

一、伪需求

使用微信的收款二维码替换支付宝收款码上的二维码。

先上上图:进行素材准备,这是老婆大人的收款码,如果您看满意了,可以给她个小惊喜。

           


二、技术分析

  1. 微信收款码替换支付宝上的二维码,则意味着在图层上:支付宝收款码的作为背景图,微信二维码为前景图;
  2. 我们需要做的就是【确定微信二维码在支付宝二维码上的坐标位置】即可;

三、上代码


import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

/**
 * @author zhanghl
 * @version PicMergeService.java, v 0.1
 */
@Slf4j
@Component
public class PicMergeService {
    /**
     * 背景图
     */
    public static final String BACKGROUND = "/Users/zhanghl/merge_pic/alipay_code.jpg";
    /**
     * 前景图
     */
    public static final String FOREGROUND = "/Users/zhanghl/merge_pic/wxminicode.png";
    /**
     * 生成的文件目录:根据自己需要修改本地路径
     */
    public static final String MERGE_PATH = "/Users/zhanghl/merge_pic/mergecode.png";

    public static void main(String[] args) {
        try {
            // 读取背景图
            File backgroundFile = new File(BACKGROUND);
            BufferedImage backImgBuffer = ImageIO.read(backgroundFile);

            // 读取前景图
            File foregroundFile = new File(FOREGROUND);
            BufferedImage foreImgBuffer = ImageIO.read(foregroundFile);

            // 生成一张底图,并设置宽度与高度,跟背景图的宽度高度一致,可根据需要修改获取使用指定背景图
//            BufferedImage blankImgBuffer = new BufferedImage(backImgBuffer.getWidth(), backImgBuffer.getHeight(), BufferedImage.TYPE_INT_RGB);
//            Graphics2D graphics = (Graphics2D) backImgBuffer.getGraphics();
//            graphics.setBackground(Color.WHITE);
//            graphics.fillRect(0, 0, backImgBuffer.getWidth(), backImgBuffer.getHeight());
            Graphics2D graphics = (Graphics2D) backImgBuffer.getGraphics();

            // 合成背景图 backImgBuffer
            graphics.drawImage(backImgBuffer, 0, 0, null);

            /*
             * 合成前景图 foreImgBuffer
             * 可以调整 前景图的x、y轴坐标为来查看效果
             */
            graphics.drawImage(foreImgBuffer, 0, 0, null);
            
            // 写入本地文件
            ImageIO.write(backImgBuffer, "PNG", new File(MERGE_PATH));
            
            // 线上业务可以将合成的文件上传到服务器,获取对应图片地址
        } catch (IOException ignored) {

        }finally {
            // TODO:线上业务使用,切记合成文件后上传服务后删除本地文件
            
        }
    }
}
<properties>
    <com.google.zxing>2.2</com.google.zxing>
</properties>            

<!-- 条形码、二维码生成 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>${com.google.zxing}</version>
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>${com.google.zxing}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

四、看效果

设置前景图坐标 x = 0、y = 0 的效果 👆🏻

设置前景图坐标 x = 200、y = 0 的效果 👆🏻​​​​​​

设置前景图坐标 x = 200、y = 400 的效果 👆🏻​​​​​​

设置前景图坐标 x = 210、y = 600 的效果 👆🏻​​​​​​

五、综述

通过合成坐标的设置发现,x轴 从左向右延伸、y轴 自上向下延伸,也即是说,x轴y轴的起点在图片的左上角;


  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HelloMrGen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值