我com.google.zxing.qrcode.QRCodeWriter
用于对数据进行编码并com.google.zxing.client.j2se.MatrixToImageWriter
生成 QR 码图像。在 400x400 的图像上,代码周围有大约 52 像素宽的边框。我希望这个边框更窄,可能是 15 像素,但我在 API 中看不到任何这样做的东西。我在文档中遗漏了什么吗?还是我需要自己处理图像?
作为参考,这里是一个使用 ZXing 库生成的 400x400 QR 码示例:
我com.google.zxing.qrcode.QRCodeWriter
用于对数据进行编码并com.google.zxing.client.j2se.MatrixToImageWriter
生成 QR 码图像。在 400x400 的图像上,代码周围有大约 52 像素宽的边框。我希望这个边框更窄,可能是 15 像素,但我在 API 中看不到任何这样做的东西。我在文档中遗漏了什么吗?还是我需要自己处理图像?
作为参考,这里是一个使用 ZXing 库生成的 400x400 QR 码示例:
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 */
如果更改此设置,则可能会降低解码成功率。
即使设置EncodeHintType.MARGIN
为0
,将 QRCode“点”矩阵转换为像素数据的算法也可以生成较小的边距(该算法强制每个点的像素数恒定,因此边距像素大小是像素大小的整数除法的余数通过 QR 码点大小)。
但是,您可以完全绕过这种“点到像素”生成:您可以通过调用公共类直接计算 QRCode 点阵com.google.zxing.qrcode.encoder.Encoder
,并自己生成像素图像。下面的代码:
// 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);
将 PNG 数据转换BufferedImage
为练习留给读者。您还可以通过设置每个点的固定像素数来缩放图像。
这种方式通常更优化,生成的图像尺寸尽可能小。如果您依赖客户端缩放图像(无模糊),则每个点不需要超过 1 个像素。
HashMap hintMap = new HashMap();
hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.Q);
hintMap.put(EncodeHintType.MARGIN, -1);
没有保证金
更新
添加依赖项(来自评论)
<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>
迅速你可以:
let hints = ZXEncodeHints()
hints!.margin = NSNumber(int: 0)
let result = try writer.encode(code, format: format, width: Int32(size.width), height: Int32(size.height), hints: hints)
let cgImage = ZXImage(matrix: result, onColor: UIColor.blackColor().CGColor, offColor: UIColor.clearColor().CGColor).cgimage
let QRImage = UIImage(CGImage: cgImage)