0
点赞
收藏
分享

微信扫一扫

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

凯约 2022-05-01 阅读 74
图像处理

以下述伪需求为例,进行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轴的起点在图片的左上角;


举报

相关推荐

0 条评论