Java利用QR Code生成二维码(二)

来源:互联网 发布:淘宝卖家ipad客户端 编辑:程序博客网 时间:2024/06/05 19:12

jar包下载地址:链接:http://pan.baidu.com/s/1miC2gCK 密码:wp35


package example;import java.awt.image.BufferedImage;import jp.sourceforge.qrcode.data.QRCodeImage;/** *  * @author Administrator * */public class QRCodeImageImpl implements QRCodeImage {BufferedImage bufImg;public QRCodeImageImpl(BufferedImage bufImg) {this.bufImg = bufImg;}@Overridepublic int getHeight() {return bufImg.getHeight();}@Overridepublic int getPixel(int x, int y) {return bufImg.getRGB(x, y);}@Overridepublic int getWidth() {return bufImg.getWidth();}}

package example;import java.awt.Color;import java.awt.Graphics2D;import java.awt.Image;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import javax.imageio.ImageIO;import jp.sourceforge.qrcode.QRCodeDecoder;import jp.sourceforge.qrcode.exception.DecodingFailedException;import com.swetake.util.Qrcode;/** * 二维码工具类 */public class QRCodeTool {/** *  * 生成二维码(QRCode)图片 *  * @param content *            存储内容 * @param imgPath *            图片路径 * @param imgLogoPath *            图片logo路径 */public static void encoderQRCode(String content, String imgPath,String imgLogoPath) {encoderQRCode(content, imgPath, "png", 2, imgLogoPath);}/** *  * 生成二维码(QRCode)图片 *  * @param content *            存储内容 * @param output *            输出流 * @param imgLogoPath *            图片logo路径 */public static void encoderQRCode(String content, OutputStream output,String imgLogoPath) {encoderQRCode(content, output, "png", 2, imgLogoPath);}/** *  * 生成二维码(QRCode)图片 *  * @param content *            存储内容 * @param imgPath *            图片路径 * @param imgType *            图片类型 * @param imgLogoPath *            图片logo路径 */public static void encoderQRCode(String content, String imgPath,String imgType, String imgLogoPath) {encoderQRCode(content, imgPath, imgType, 2, imgLogoPath);}/** *  * 生成二维码(QRCode)图片 *  * @param content *            存储内容 * @param output *            输出流 * @param imgType *            图片类型 * @param imgLogoPath *            图片logo路径 */public static void encoderQRCode(String content, OutputStream output,String imgType, String imgLogoPath) {encoderQRCode(content, output, imgType, 2, imgLogoPath);}/** *  * 生成二维码(QRCode)图片 *  * @param content *            存储内容 * @param imgPath *            图片路径 * @param imgType *            图片类型 * @param size *            二维码尺寸 * @param imgLogoPath *            图片logo路径 */public static void encoderQRCode(String content, String imgPath,String imgType, int size, String imgLogoPath) {try {BufferedImage bufImg = qRCodeCommon(content, imgType, size,imgLogoPath);File imgFile = new File(imgPath);// 生成二维码QRCode图片ImageIO.write(bufImg, imgType, imgFile);} catch (Exception e) {e.printStackTrace();}}/** * 生成二维码(QRCode)图片 *  * @param content *            存储内容 * @param output *            输出流 * @param imgType *            图片类型 * @param size *            二维码尺寸 * @param imgLogoPath *            图片logo路径 */public static void encoderQRCode(String content, OutputStream output,String imgType, int size, String imgLogoPath) {try {BufferedImage bufImg = qRCodeCommon(content, imgType, size,imgLogoPath);// 生成二维码QRCode图片ImageIO.write(bufImg, imgType, output);} catch (Exception e) {e.printStackTrace();}}/** * 生成二维码(QRCode)图片的公共方法 *  * @param content *            存储内容 * @param imgType *            图片类型 * @param size *            二维码尺寸 * @param imgLogoPath *            图片logo路径 * @return */private static BufferedImage qRCodeCommon(String content, String imgType,int size, String imgLogoPath) {BufferedImage bufImg = null;size = 10;try {Qrcode qrcodeHandler = new Qrcode();// 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小qrcodeHandler.setQrcodeErrorCorrect('M');qrcodeHandler.setQrcodeEncodeMode('B');// 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大qrcodeHandler.setQrcodeVersion(size);// 获得内容的字节数组,设置编码格式byte[] contentBytes = content.getBytes("utf-8");// 图片尺寸// int imgSize = 67 + 12 * (size - 1);int imgSize = 67 + 12 * (size - 1);// System.out.println(imgSize);bufImg = new BufferedImage(imgSize, imgSize,BufferedImage.TYPE_INT_RGB);Graphics2D gs = bufImg.createGraphics();// 设置背景颜色gs.setBackground(Color.WHITE);gs.clearRect(0, 0, imgSize, imgSize);// 设定图像颜色 > BLACKgs.setColor(Color.BLACK);// 设置偏移量,不设置可能导致解析出错int pixoff = 2;// 输出内容> 二维码if (contentBytes.length > 0 && contentBytes.length < 800) {boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);for (int i = 0; i < codeOut.length; i++) {for (int j = 0; j < codeOut.length; j++) {if (codeOut[j][i]) {gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);}}}} else {throw new Exception("QRCode content bytes length = "+ contentBytes.length + " not in [0, 800].");}if (imgLogoPath != null) {Image img = ImageIO.read(new File(imgLogoPath));gs.drawImage(img, bufImg.getWidth() / 4 + bufImg.getHeight()/ 2, bufImg.getHeight() / 4 + bufImg.getHeight() / 2,bufImg.getWidth() / 4, bufImg.getHeight() / 4, null);}gs.dispose();bufImg.flush();} catch (Exception e) {e.printStackTrace();}return bufImg;}/** * 解析二维码(QRCode) *  * @param imgPath *            图片路径 * @return */public static String decoderQRCode(String imgPath) throws Exception {// QRCode 二维码图片的文件File imageFile = new File(imgPath);BufferedImage bufImg = null;String content = null;try {bufImg = ImageIO.read(imageFile);QRCodeDecoder decoder = new QRCodeDecoder();content = new String(decoder.decode(new QRCodeImageImpl(bufImg)),"utf-8");} catch (IOException e) {// System.out.println("Error: " + e.getMessage());// e.printStackTrace();} catch (DecodingFailedException dfe) {// System.out.println("Error: " + dfe.getMessage());// dfe.printStackTrace();}return content;}/** * 解析二维码(QRCode) *  * @param input *            输入流 * @return */public static String decoderQRCode(InputStream input) {BufferedImage bufImg = null;String content = null;try {bufImg = ImageIO.read(input);QRCodeDecoder decoder = new QRCodeDecoder();content = new String(decoder.decode(new QRCodeImageImpl(bufImg)),"utf-8");} catch (IOException e) {System.out.println("Error: " + e.getMessage());e.printStackTrace();} catch (DecodingFailedException dfe) {System.out.println("Error: " + dfe.getMessage());dfe.printStackTrace();}return content;}}

package example;public class Test {@SuppressWarnings("static-access")public static void main(String[] args) throws Exception {String imgPath = "file/QRcode.png";String encoderContent = "http://www.baidu.com";QRCodeTool handler = new QRCodeTool();handler.encoderQRCode(encoderContent, imgPath, "file/Baidu.png");// try {// OutputStream output = new FileOutputStream(imgPath);// handler.encoderQRCode(encoderContent, output, "file/Baidu.png");// } catch (Exception e) {// e.printStackTrace();// }System.out.println("======编码成功======");// String decoderContent = handler.decoderQRCode(imgPath);System.out.println("解析结果如下:");// System.out.println(decoderContent);System.out.println("======解码成功======");}}

百度logo


运行结果如下:


0 0