美文网首页
java实现往指定图片上贴二维码 (任意角度旋转)

java实现往指定图片上贴二维码 (任意角度旋转)

作者: 唐植超 | 来源:发表于2019-11-15 09:27 被阅读0次

应用场景

推广海报,每个业务员拿的的海报,都要有自己的二维码,美工根本忙不过来,也不好管理。

上代码

pom.xml

          <!-- https://mvnrepository.com/artifact/cn.bingoogolapple/bga-qrcode-zxing -->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.4.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.google.zxing/javase -->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.4.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator -->
        <dependency>
            <groupId>net.coobird</groupId>
            <artifactId>thumbnailator</artifactId>
            <version>0.4.8</version>
        </dependency>

工具类

package org.alvin.qws;

import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import net.coobird.thumbnailator.Thumbnails;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.Dimension;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;

/**
 * @author 唐植超
 * @date 2019/11/06
 */
public class QRCodeImageUtils {
    /**
     * 生成二维码
     *
     * @param content
     * @param size
     * @return
     */
    public static BitMatrix genQrCode(String content, int size) {
        //设置图片的文字编码以及内边框
        Map<EncodeHintType, Object> hints = new HashMap<>();
        //编码
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        //边框距
        hints.put(EncodeHintType.MARGIN, 0);
        BitMatrix bitMatrix;
        try {
            //参数分别为:编码内容、编码类型、图片宽度、图片高度,设置参数
            bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, size, size, hints);
        } catch (WriterException e) {
            e.printStackTrace();
            return null;
        }
        return bitMatrix;
    }

    /**
     * 二维码转字节
     *
     * @param content
     * @param size
     * @return
     * @throws IOException
     */
    public static byte[] getQrBuffer(String content, int size) throws IOException {
        try (ByteArrayOutputStream byteArray = new ByteArrayOutputStream()) {
            MatrixToImageWriter.writeToStream(genQrCode(content, size), "png", byteArray);
            return byteArray.toByteArray();
        }
    }

    /**
     * 二维码转图片
     *
     * @param content
     * @param size
     * @return
     */
    public static BufferedImage getQRImg(String content, int size) {
        return MatrixToImageWriter.toBufferedImage(genQrCode(content, size));
    }


    /**
     * 合并图片和二维码
     *
     * @param logoPath  图标路径
     * @param imgPath   模板途径
     * @param qrContent 二维码内容
     * @param size      //二维码尺寸
     * @param x         //二维码贴的位置x
     * @param y         //二维码贴的位置y
     * @param angel     //传0没有角度
     * @return
     */
    public static BufferedImage mergeImageAndQR(String logoPath, String imgPath, String qrContent, int size, int x, int y, double angel) throws IOException {
        try (InputStream is = Files.newInputStream(Paths.get(imgPath))) {
            BufferedImage bi = ImageIO.read(is);
            Graphics2D g2 = bi.createGraphics();
            BufferedImage bufferedImage = null;
            if (logoPath != null && !logoPath.isEmpty()) {
                File logoFile = new File(logoPath);
                if (logoFile != null && logoFile.exists()) {
                    bufferedImage = drawLogoQRCode(logoFile, qrContent, size, angel);
                }
            } else {
                bufferedImage = Thumbnails.of(getQRImg(qrContent, size)).size(size, size).rotate(angel).asBufferedImage();
            }
            //消除文字锯齿
            g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
            //消除画图锯齿
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2.drawImage(bufferedImage, x, y, null);
            g2.dispose();
            return bi;
        }

    }


    /**
     * 根据图片路径识别二维码
     *
     * @param imgPath
     * @return
     * @throws IOException
     * @throws NotFoundException
     */
    public static String readQr(String imgPath) throws IOException, NotFoundException {
        try (InputStream is = Files.newInputStream(Paths.get(imgPath))) {
            return readQrByImg(ImageIO.read(is));
        }
    }

    //根据传入的图片,识别二维码
    public static String readQrByImg(BufferedImage img) throws NotFoundException {
        BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(img)));
        HashMap properties = new HashMap();
        properties.put(EncodeHintType.CHARACTER_SET, "utf-8");//字符集
        MultiFormatReader formatReader = new MultiFormatReader();
        Result result = formatReader.decode(binaryBitmap, properties);
        return result.getText();
    }

    /**
     * 生成带logo的二维码图片
     *
     * @param logoFile logo路径
     * @param content  内容
     * @param size     二维码大小
     * @param angel
     */
    public static BufferedImage drawLogoQRCode(File logoFile, String content, int size, double angel) throws IOException {
        BufferedImage image = Thumbnails.of(getQRImg(content, size)).size(size, size).rotate(angel).asBufferedImage();
        int width = image.getWidth();
        int height = image.getHeight();
        //绘制logo
        // 构建绘图对象
        Graphics2D g2 = image.createGraphics();
        // 读取Logo图片
        int x = width * 2 / 5;
        int y = height * 2 / 5;
        int cWidth = width * 2 / 10;
        int cHeight = height * 2 / 10;
        BufferedImage bufferedImage = Thumbnails.of(ImageIO.read(logoFile)).size(width, height).rotate(angel).asBufferedImage();
        // 开始绘制logo图片
        //消除文字锯齿
        g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        //消除画图锯齿
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.drawImage(bufferedImage, x, y, cWidth, cHeight, null);
        g2.dispose();
        bufferedImage.flush();
        image.flush();
        return image;
    }


 
}

测试类

      public static void main(String[] args) throws IOException, NotFoundException {
        String imagePath = "D:\\test.jpg";
        String qrContent = "http://www.baidu.com";
        int size = 100;
        int x = 30;
        int y = 380;
        //合并输出二维码
//        BufferedImage img = mergeImageAndQRByAngel(imagePath, qrContent, size, x, y, 20);
//        ImageIO.write(img, "png", new File("D:/test1.png"));
//        识别二维码
//        System.out.println(readQrByImg(img));
        BufferedImage img = mergeImageAndQR("D:/th.jpg", imagePath, qrContent, size, x, y, 30);
        ImageIO.write(img, "png", new File("D:/test1.png"));
    }

相关文章

网友评论

      本文标题:java实现往指定图片上贴二维码 (任意角度旋转)

      本文链接:https://www.haomeiwen.com/subject/rcjjictx.html