我正在使用com.google.zxing.qrcode.QRCodeWriter
编码数据并com.google.zxing.client.j2se.MatrixToImageWriter
生成QR码图像.在400x400图像上,代码周围有大约52像素宽的边框.我希望这个边框更窄,可能是15像素,但我没有在API中看到任何内容.我在文档中遗漏了什么吗?或者我需要自己处理图像?
作为参考,这里是使用ZXing库生成的400x400 QR码示例:
smp*_*kes 70
QR规范需要一个四模块静区,这就是zxing创造的.(参见QUIET_ZONE_SIZE
在QRCodeWriter.renderResult.)
更新版本的ZXing允许您通过使用EncodeHintType.MARGIN
键提供int值来设置静区的大小(基本上是QR码的内部填充).只需将其包含在提示Map
您提供给Writer
的encode(...)
方法,如:
Map<EncodeHintType, Object> hints = new EnumMap<EncodeHintType, Object>(EncodeHintType.class);
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
hints.put(EncodeHintType.MARGIN, 2); /* default = 4 */
Run Code Online (Sandbox Code Playgroud)
如果更改此设置,则可能会降低解码成功率.
甚至通过设置EncodeHintType.MARGIN
到0
,该转换QRCode的"点"矩阵的像素数据可以产生小幅度的算法(该算法执行每点的像素的恒定数,因此,余量像素尺寸的像素大小的整数除法的余数按QR码代码点大小).
但是,您可以完全绕过这种"点到像素"生成:通过调用公共com.google.zxing.qrcode.encoder.Encoder
类直接计算QRCode点阵,并自己生成像素图像.代码如下:
// Step 1 - generate the QRCode dot array
Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>(1);
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
QRCode qrCode = Encoder.encode(what, ErrorCorrectionLevel.L, hints);
// Step 2 - create a BufferedImage out of this array
int width = qrCode.getMatrix().getWidth();
int height = qrCode.getMatrix().getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
int[] rgbArray = new int[width * height];
int i = 0;
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
rgbArray[i] = qrCode.getMatrix().get(x, y) > 0 ? 0xFFFFFF : 0x000000;
i++;
} }
image.setRGB(0, 0, width, height, rgbArray, 0, width);
Run Code Online (Sandbox Code Playgroud)
将BufferedImage
PNG数据转换为练习给读者.您还可以通过设置每个点的固定像素数来缩放图像.
它通常以这种方式进行优化,生成的图像尺寸尽可能小.如果您依靠客户端来缩放图像(没有模糊),则每个点不需要超过1个像素.
小智 5
HashMap hintMap = new HashMap();
hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.Q);
hintMap.put(EncodeHintType.MARGIN, -1);
Run Code Online (Sandbox Code Playgroud)
没有保证金
更新
添加依赖项(来自评论)
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.2.0</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.2.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)