- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面的程序使用ZXing(和PDFBox)将字节数组(长度N=1,2,3,...)编码为二维码,然后嵌入到PDF文档中,渲染,提取为BufferedImage,并解码。比较解码和编码的字节数组。首先尝试不使用解码选项 PURE_BARCODE 进行解码,如果失败,则尝试使用 PURE_BARCODE 选项进行解码。
解码在 N=20 左右开始失败(对于示例随机种子,N=28)。请注意,在解码失败之前,字节数组会被正确解码。
当解码失败时,会在对话框中显示失败的二维码,并将有效负载字符串打印到控制台。
但是,如果我将手机指向此对话框,我的手机没有问题解码此二维码图像,并且解码后的字符串与控制台上的一致。
我犯了什么错误?
package zxing;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.ChecksumException;
import com.google.zxing.DecodeHintType;
import com.google.zxing.EncodeHintType;
import com.google.zxing.FormatException;
import com.google.zxing.NotFoundException;
import com.google.zxing.RGBLuminanceSource;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeReader;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Arrays;
import java.util.EnumMap;
import java.util.Map;
import java.util.PrimitiveIterator;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;
public class Problem {
public static void main(String[] args) throws IOException,
WriterException,
NotFoundException,
ChecksumException,
FormatException {
Random r = new Random(12345);
PrimitiveIterator.OfInt rb = r.ints(-128, 127).iterator();
for (int N = 1; N < 100; N += 1) { // encode and decode random byte arrays of size N
System.out.println(N);
for (int numRuns = 0; numRuns < 10; numRuns++) { // number of tries at size N
byte[] payload = new byte[N]; // payload to be encoded
for (int i = 0; i < N; i++) { // payload random initialization
payload[i] = rb.next().byteValue();
}
final String payloadString = new String(payload, STRING_ENCODING); // encode as string
// encode using zxing
final BufferedImage qr = MatrixToImageWriter.toBufferedImage(new QRCodeWriter().encode(payloadString,
BarcodeFormat.QR_CODE, 256, 256, ENCODING_HINTS));
// insert into PDF
PDDocument pdDocument = new PDDocument();
PDPage page = new PDPage();
pdDocument.addPage(page);
PDPageContentStream pageContent = new PDPageContentStream(pdDocument, page);
pageContent.drawImage(JPEGFactory.createFromImage(pdDocument, qr), 0, 0, 200, 200);
pageContent.close();
// render pdf and extract qr code image
BufferedImage pageImage = new PDFRenderer(pdDocument).renderImage(0);
BufferedImage qrcodeImage = pageImage.getSubimage(0, pageImage.getHeight() - 200, 200, 200);
pdDocument.close();
byte[] resultPayload;
try { // try zxing decode qrcodeImage *not* in PURE_BARCODE mode
resultPayload = new QRCodeReader().decode(
new BinaryBitmap(new HybridBinarizer(new RGBLuminanceSource(qrcodeImage.getWidth(),
qrcodeImage.getHeight(),
qrcodeImage.getRGB(0, 0, qrcodeImage.getWidth(), qrcodeImage.getHeight(), null, 0,
qrcodeImage.getWidth())))), DECODING_HINTS_IMPURE).getText().getBytes(
STRING_ENCODING);
} catch (Throwable ex) {
try { // failed so try zxing decode qrcodeImage in PURE_BARCODE mode
resultPayload = new QRCodeReader().decode(
new BinaryBitmap(new HybridBinarizer(new RGBLuminanceSource(qrcodeImage.getWidth(),
qrcodeImage.getHeight(),
qrcodeImage.getRGB(0, 0, qrcodeImage.getWidth(), qrcodeImage.getHeight(), null,
0,
qrcodeImage.getWidth())))), DECODING_HINTS_PURE).getText().getBytes(
STRING_ENCODING);
} catch (Throwable ex2) { // both decodings failed, display image
JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(qrcodeImage)),
"N=" + Integer.toString(N),
JOptionPane.PLAIN_MESSAGE, null);
System.out.println("Encoded=" + payloadString);
throw ex2;
}
}
if (!Arrays.equals(payload, resultPayload)) {
throw new RuntimeException("Payload mismatch.");
}
}
}
}
private final static String STRING_ENCODING = "ISO-8859-1";
final private static Map<EncodeHintType, Object> ENCODING_HINTS = new EnumMap<EncodeHintType, Object>(
EncodeHintType.class);
static {
ENCODING_HINTS.put(EncodeHintType.CHARACTER_SET, STRING_ENCODING);
ENCODING_HINTS.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
}
final private static Map<DecodeHintType, Object> DECODING_HINTS_IMPURE = new EnumMap<DecodeHintType, Object>(
DecodeHintType.class);
static {
DECODING_HINTS_IMPURE.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
DECODING_HINTS_IMPURE.put(DecodeHintType.CHARACTER_SET, STRING_ENCODING);
}
final private static Map<DecodeHintType, Object> DECODING_HINTS_PURE = new EnumMap<DecodeHintType, Object>(
DecodeHintType.class);
static {
DECODING_HINTS_PURE.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
DECODING_HINTS_PURE.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE);
DECODING_HINTS_PURE.put(DecodeHintType.CHARACTER_SET, STRING_ENCODING);
}
}
[... ZXing 抛出一个 FormatException ...]
[...ZXing手机应用程序也可以读取对话框二维码...]
最佳答案
以下更改将精度提高到大约 N=64 的高质量纠错和 N=100 没有纠错(这足以满足我的需求)。
需要进行三处更改。
首先,按照@Tilman Hausherr 的建议,在将二维码图像插入 PDF 时使用无损工厂。虽然这对 OP 中提供的代码没有任何影响,但它是其他更改生效的必要共同条件。
此外,以二进制而不是 rgb 格式呈现 PDF,并以更高的比例。默认比例 (1.0) 仅为 72dpi。
pageContent.drawImage(LosslessFactory.createFromImage(pdDocument, qr), 0, 0, 200, 200);
...
BufferedImage pageImage = new PDFRenderer(pdDocument)
.renderImage(0,3.0f,ImageType.BINARY);
关于java - 为什么ZXing解码这么差?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46929432/
我正在为我的移动应用程序项目使用 worklight。我的问题是,我不知道在哪里可以找到这些文件(zxing-all-in-one.cpp 和 zxing-all-in-one.h),用于在 Xcod
我在 .NET 上使用 zxing 取得了巨大成功,并试图获得解码 QR 条码的最佳速度(我有很多事情要做——1.8M)。我正在使用的代码(它的一部分): // Create Barcode deco
我使用 com.google.zxing.qrcode.QRCodeWriter 对数据进行编码,并使用 com.google.zxing.client.j2se.MatrixToImageWrite
我项目的包名是 com.mohit.verma 我不想在外部安装 zxing 条码扫描仪应用程序。 我只想使用库文件。 那么我应该在哪里更改包名称? 任何帮助,将不胜感激... 我的代码如下: ba
我正在尝试使用说明 here 构建 Zxing android 应用程序(不是库) .我能够构建 jar 但无法构建应用程序本身。当我运行 mvn package android:apk 时,出现以下
本文整理了Java中jsc.kit.zxing.zxing.ui.ZXingFragment类的一些代码示例,展示了ZXingFragment类的具体用法。这些代码示例主要来源于Github/Stac
我正在开发一个通过 ZXing 在 Android 上扫描条形码的应用程序。我关注这个tutorial . 但是当我运行我的应用程序时,出现 NoClassDefFoundError 并且应用程序已完
我已经下载了适用于 Android 的 Zxing Barcode Scanner 代码,但我在源代码中找不到软件包 com.google.zxing。我认为该项目缺少库或 JAR 文件。谁能帮我找到
我正在尝试做一个应用程序来为多个条形码的信息创建一个最终的二维码我扫描过的。我想知道您如何将 ZXing 库导入您的代码?假设用户已经在他们的手机中安装了 ZXing 扫描仪,我是否可以只连接应用程序
我正在尝试使用 ZXing 2.1 库获得成功的结果。我在 Mac OS X 10.7.5 上使用 Java 1.6。我能够编码文本但不能解码任何图像。相反,我得到的只是 com.google.zxi
我正在使用 ZXing.Net 0.16.4.0 解码保存在 中的二维码文件'wwwroot/qrr' 文件夹,但我收到编译时错误: Cannot convert from 'System.Drawi
我已经将 Zxing 作为库集成并在我的应用程序中使用。我调用 Intent intent = new Intent("com.google.zxing.client.android.SCAN");
我正在尝试将 zxing 扫描仪合并到我的 Angular 应用程序中,在按照在线指南进行操作后,它出现了以下我似乎无法解决的错误, 'zxing-scanner' 不是已知元素: 如果“zxing-
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我想实现来自 https://github.com/dm77/barcodescanner 的条码扫描器库.像这样运行项目后出现错误 java.lang.NoSuchFieldError: No st
我使用此代码生成我的二维码 ZXing.Net ( http://zxingnet.codeplex.com/ ) IBarcodeWriter writer = new BarcodeWriter
我想使用 ZXing 库制作一个二维码扫描器。在我的 build.gradle 中,我添加了以下代码: repositories { mavenCentral() maven {
我正在试验 ResultPoints,它返回与图像中条形码相关的点。 对于二维码,ResultPoints 返回一组 4 个点,它们是二维码每个角的四个框的坐标。 当我对条码进行同样的实验时,它返回两
我正在开发一个 android 应用程序,在其中我生成数据矩阵并允许用户使用 zxing 输入它们来扫描它们。 但是,出现了一个许可证问题,询问 zxing 扫描的所有格式是否都可用开源。 这与应用程
我将 ZXing.Net.Mobile 用于这样的表单 var scanPage = new ZXingScannerPage();
我是一名优秀的程序员,十分优秀!