使用zxing生成二维码一些小点 计算空白区域大小 去除空白区域方法

   

  通常我们生成二维码需要做以下配置

        Map<EncodeHintType, Object> hints = new HashMap<>();
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);//设置容错率默认为最高
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");// 字符编码为UTF-8
        hints.put(EncodeHintType.MARGIN, 0);//二维码空白区域,最小为0也有白边,只是很小,最小是6像素左右

生成的二维码的空白区域怎么设置都是有

实测试100、1000大小的空白像素如   top:7 right:8 bottom:8 left:7  右边、底部会多一个像素

二维码生成返回的对像 BitMatrix可以直接遍历,可以把它当作一个二维数组,通过BitMatrix.get(x,y)判断是否是一个黑点,然后复制到一个新的二 维码对像即可,实例代码如下

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by zengrenyuan 
 */
public class QRCodeImageTest {

    private static final Logger LOG = LoggerFactory.getLogger(QRCodeImageTest.class);

    public static void main(String[] args) {
        String format = "png";// 图像类型
        String target = "/data/qrcode.png";
        Map<EncodeHintType, Object> hints = new HashMap<>();
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);//设置容错率默认为最高
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");// 字符编码为UTF-8
        hints.put(EncodeHintType.MARGIN, 0);//二维码空白区域,最小为0也有白边,只是很小,最小是6%左右
        try (OutputStream os = new FileOutputStream(target)) {
            //二维码的宽
            int qrCodeWidth = 1000;
            BitMatrix bitMatrix = new MultiFormatWriter()
                    .encode("https://www.baidu.com", BarcodeFormat.QR_CODE, qrCodeWidth, qrCodeWidth, hints);
            int height = bitMatrix.getHeight();
            int width = bitMatrix.getWidth();

            try (OutputStream os1 = new FileOutputStream("/data/qrcode.png")) {
                MatrixToImageWriter.writeToStream(bitMatrix, format, os1);
            }


            boolean isFirstBlankPoint = false;//是否第一个黑点
            int left = 0;//开始的宽
            int top = 0;//开始的高
            for (int y = 0; y < height; y++) {//从左上角开始读
                if (isFirstBlankPoint) {
                    break;
                }
                for (int x = 0; x < width; x++) {
                    if (bitMatrix.get(x, y) && !isFirstBlankPoint) {//如果是一个黑点就会返回true
                        isFirstBlankPoint = true;
                        left = x;
                        top = y;
                        LOG.info("f x:{} y:{}", x, y);
                    }
                }
            }

            int right = 0;//右边空白区域
            int bottom = 0;//底部空白区域

            boolean isRightLastPoint = false;
            for (int x = width - 1; x >= 0; x--) {//从右上角开始读
                if (isRightLastPoint) {
                    break;
                }
                for (int y = 0; y < height; y++) {
                    if (bitMatrix.get(x, y) && !isRightLastPoint) {//如果是一个黑点就会返回true
                        isRightLastPoint = true;
                        right = width - x;
                        LOG.info("e x:{} y:{} right:{}", x, y, right);
                        break;
                    }
                }
            }
            boolean isBottomLastPoint = false;
            for (int y = height - 1; y >= 0; y--) {//从左理角开始读
                if (isBottomLastPoint) {
                    break;
                }
                for (int x = 0; x < width; x++) {
                    if (bitMatrix.get(x, y) && !isBottomLastPoint) {
                        isBottomLastPoint = true;
                        bottom = height - y;
                        LOG.info("e x:{} y:{} bottom:{}", x, y, bottom);
                        break;
                    }
                }
            }

            LOG.info("top:{} right:{} bottom:{} left:{} ", top, right, bottom, left);
            //最小的空白区域一个像素
            int miniPadding = 1;
            //原二维码大小减去上下左右的空白区域
            int newWidth = qrCodeWidth - left - right + miniPadding * 2;
            int newHeight = qrCodeWidth - top - bottom + miniPadding * 2;
            BitMatrix newBitMatrix = new BitMatrix(newWidth, newHeight);
            //写二维码点的宽度
            int pointSize = 1;
            for (int y = miniPadding; y < newHeight; y++) {
                for (int x = miniPadding; x < newWidth; x++) {
                    if (bitMatrix.get(x + left, y + top)) {
                        newBitMatrix.setRegion(x, y, pointSize, pointSize);
                    }
                }
            }
            MatrixToImageWriter.writeToStream(newBitMatrix, format, os);
        } catch (Exception e) {
            LOG.error(null, e);
        }

    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值