什么是QR码?
QR Code或Quick Response Code是二维条形码,现代智能手机和特殊的QR Code扫描仪设备均可读取。
QR码由排列在白色背景上的正方形网格中的黑色正方形组成。QR码有多种变体,具体取决于它们的符号大小,布局,编码和结构。
以下是典型QR码的图像(我已经在此QR码图像中进行了编码。请从您的智能手机对其进行扫描以检查其内部内容:-)-
QR码可用于编码各种类型的数据,例如-简单文本,URL,电话号码,短信,地理位置,电子邮件地址等。
在下一节中,我们将学习如何对此类数据进行编码并使用Java生成QR Code。
如何在Java中生成QR码?
我们将使用Google的Zxing库为我们的应用程序生成QR码。
Zxing,发音为Zebra Crossing,是一种用Java实现的开源,多格式1D / 2D条码图像处理库。
1.添加Zxing依赖项
下载Maven发布存储库中托管的以下zxing jar并将其添加到类路径中-
2.生成QR码的程序
在下面的程序中,我编写了一个名为的方法generateQRCodeImage
,该方法获取要编码的文本,QR Code的宽度和高度,以及将保存QR Code的文件系统路径。
该函数生成QR码并将其保存在指定路径中。
import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
public class QRCodeGenerator {
private static final String QR_CODE_IMAGE_PATH = "./MyQRCode.png";
private static void generateQRCodeImage(String text, int width, int height, String filePath)
throws WriterException, IOException {
QRCodeWriter qrCodeWriter = new QRCodeWriter();
BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);
Path path = FileSystems.getDefault().getPath(filePath);
MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);
}
/*
This method takes the text to be encoded, the width and height of the QR Code,
and returns the QR Code in the form of a byte array.
*/
private static byte[] getQRCodeImage(String text, int width, int height) throws WriterException, IOException {
QRCodeWriter qrCodeWriter = new QRCodeWriter();
BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);
ByteArrayOutputStream pngOutputStream = new ByteArrayOutputStream();
MatrixToImageWriter.writeToStream(bitMatrix, "PNG", pngOutputStream);
byte[] pngData = pngOutputStream.toByteArray();
return pngData;
}
public static void main(String[] args) {
try {
generateQRCodeImage("This is my first QR Code", 350, 350, QR_CODE_IMAGE_PATH);
} catch (WriterException e) {
System.out.println("Could not generate QR Code, WriterException :: " + e.getMessage());
} catch (IOException e) {
System.out.println("Could not generate QR Code, IOException :: " + e.getMessage());
}
try {
byte[] myQRCode=getQRCodeImage("This is my first QR Code", 350, 350);
System.out.println(myQRCode.length);
} catch (WriterException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
上面的程序将生成带有文本的QR码-“这是我的第一个QR码”,并将其保存在指定的位置。这是生成的QR码-
上面的generateQRCode
方法将QRCode图像写入指定的位置。如果您不想保存QRCode并想从函数中将其作为字节数组返回,则可以使用MatrixToImageWriter.writeToStream()
zxing库提供的方法-
上面的方法非常有用-
-
如果您正在开发Web应用程序,并且想返回QR码图像作为对http请求的响应。您可以在http响应的正文中返回字节数组。
-
如果您正在开发android应用程序,并且想在活动屏幕上显示QR码。您可以将字节数组转换为,
BitMap
并在中显示图像ImageView
。
保护您的QR码
任何智能手机和二维码扫描仪设备都可以读取和解释使用QR Code编码的文本。但是,如果您不希望所有人都阅读QR Code中编码的内容怎么办?
嗯,QR Code本身不提供任何安全性。您可以改用以下方法-
-
在生成带有任何文本的QR码之前,请使用只有您的应用程序有权访问的秘密的任何加密算法对文本进行加密。
-
生成带有加密文本的QR码。
现在,即使有人扫描了您的QR码,他们也将获得他们无法解密的加密文本,除非他们知道用于加密它的秘密。
但是,当您在应用程序中扫描QR码时,可以使用密码对文本解密,并获取存储在QR码中的实际数据。