All Downloads are FREE. Search and download functionalities are using the official Maven repository.

goja.QRCode Maven / Gradle / Ivy

There is a newer version: 0.1.7
Show newest version
/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright (c) 2013-2014 sagyf Yang. The Four Group.
 */

package goja;

import com.google.common.base.Strings;
import com.google.common.io.Files;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.ChecksumException;
import com.google.zxing.FormatException;
import com.google.zxing.LuminanceSource;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeReader;
import com.google.zxing.qrcode.QRCodeWriter;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.Charset;

/**
 * 

.

* * @author sagyf yang * @version 1.0 2014-08-27 15:27 * @since JDK 1.6 */ public final class QRCode { /** * QRCode 生成器格式 */ private QRCodeFormat format = null; /** * 生成的 QRCode 图像对象 */ private BufferedImage qrcodeImage = null; /** * 生成的 QRCode 图片文件 */ private File qrcodeFile = null; /** * 返回生成的 QRCode 图像对象 * * @return 生成的 QRCode 图像对象 */ public BufferedImage getQrcodeImage() { return qrcodeImage; } /** * 返回生成的 QRCode 图片文件 * * @return 生成的 QRCode 图片文件 */ public File getQrcodeFile() { return qrcodeFile; } private QRCode() { } /** * 使用带默认值的「QRCode 生成器格式」来创建一个 QRCode 处理器。 * * @param content 所要生成 QRCode 的内容 * @return QRCode 处理器 */ public static QRCode create(final String content) { return create(content, QRCodeFormat.NEW()); } /** * 使用指定的「QRCode 生成器格式」来创建一个 QRCode 处理器。 * * @param content 所要生成 QRCode 的内容 * @param format QRCode 生成器格式 * @return QRCode 处理器 */ public static QRCode create(final String content, QRCodeFormat format) { QRCode qrcode = new QRCode(); qrcode.format = format; qrcode.qrcodeImage = toQRCode(content, format); return qrcode; } /** * 把指定的内容生成为一个 QRCode 的图片,之后保存到指定的文件中。 * * @param f 指定的文件 * @return QRCode 处理器 */ public QRCode toFile(String f) { return toFile(new File(f)); } /** * 把指定的内容生成为一个 QRCode 的图片,之后保存到指定的文件中。 * * @param qrcodeFile 指定的文件 * @return QRCode 处理器 */ public QRCode toFile(File qrcodeFile) { try { if (!qrcodeFile.exists()) { Files.createParentDirs(qrcodeFile); qrcodeFile.createNewFile(); } if (!ImageIO.write(this.qrcodeImage, getSuffixName(qrcodeFile), qrcodeFile)) { throw new RuntimeException(); } } catch (IOException e) { throw new RuntimeException(e); } this.qrcodeFile = qrcodeFile; return this; } /** * 把指定的内容生成为一个 QRCode 的图片,并在该图片中间添加上指定的图片;之后保存到指定的文件内。 * * @param qrcodeFile QRCode 图片生成的指定的文件 * @param appendFile 需要添加的图片 * @return QRCode 处理器 */ public QRCode toFile(String qrcodeFile, String appendFile) { return toFile(new File(qrcodeFile), new File(appendFile)); } /** * 把指定的内容生成为一个 QRCode 的图片,并在该图片中间添加上指定的图片;之后保存到指定的文件内。 * * @param qrcodeFile QRCode 图片生成的指定的文件 * @param appendFile 需要添加的图片 * @return QRCode 处理器 */ public QRCode toFile(File qrcodeFile, File appendFile) { try { if (!qrcodeFile.exists()) { Files.createParentDirs(qrcodeFile); qrcodeFile.createNewFile(); } appendImage(this.qrcodeImage, ImageIO.read(appendFile), this.format); if (!ImageIO.write(this.qrcodeImage, getSuffixName(qrcodeFile), qrcodeFile)) { throw new RuntimeException("Unexpected error writing image"); } } catch (IOException e) { throw new RuntimeException(e); } this.qrcodeFile = qrcodeFile; return this; } private void appendImage(BufferedImage baseImage, BufferedImage appendImage, QRCodeFormat format) { Graphics gc = baseImage.getGraphics(); gc.drawImage(appendImage, (baseImage.getWidth() - appendImage.getWidth()) / 2, (baseImage.getHeight() - appendImage.getHeight()) / 2, appendImage.getWidth(), appendImage.getHeight(), format.getBackGroundColor(), null); } /** * 使用带默认值的「QRCode 生成器格式」,把指定的内容生成为一个 QRCode 的图像对象。 * * @param content 所需生成 QRCode 的内容 * @return QRCode 的图像对象 */ public static BufferedImage toQRCode(String content) { return toQRCode(content, null); } /** * 使用指定的「QRCode生成器格式」,把指定的内容生成为一个 QRCode 的图像对象。 * * @param content 所需生成 QRCode 的内容 * @return QRCode 的图像对象 */ public static BufferedImage toQRCode(String content, QRCodeFormat format) { if (format == null) { format = QRCodeFormat.NEW(); } content = new String(content.getBytes(Charset.forName(format.getEncode()))); BitMatrix matrix; try { matrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, format.getSize(), format.getSize(), format.getHints()); } catch (WriterException e) { throw new RuntimeException(e); } int width = matrix.getWidth(); int height = matrix.getHeight(); int fgColor = format.getForeGroundColor().getRGB(); int bgColor = format.getBackGroundColor().getRGB(); BufferedImage image = new BufferedImage(width, height, ColorSpace.TYPE_RGB); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { image.setRGB(x, y, matrix.get(x, y) ? fgColor : bgColor); } } return image; } /** * 从指定的 QRCode 图片文件中解析出其内容。 * * @param qrcodeFile QRCode 文件 * @return QRCode 中的内容 */ public static String from(String qrcodeFile) { if (qrcodeFile.startsWith("http://") || qrcodeFile.startsWith("https://")) { try { return from(new URL(qrcodeFile)); } catch (MalformedURLException e) { throw new RuntimeException(e); } } else { return from(new File(qrcodeFile)); } } /** * 从指定的 QRCode 图片文件中解析出其内容。 * * @param qrcodeFile QRCode 图片文件 * @return QRCode 中的内容 */ public static String from(File qrcodeFile) { if(!qrcodeFile.exists()){ return null; } try { BufferedImage image = ImageIO.read(qrcodeFile); return from(image); } catch (IOException e) { throw new RuntimeException(e); } } /** * 从指定的 QRCode 图片链接中解析出其内容。 * * @param qrcodeUrl QRCode 图片链接 * @return QRCode 中的内容 */ public static String from(URL qrcodeUrl) { try { BufferedImage image = ImageIO.read(qrcodeUrl); return from(image); } catch (IOException e) { throw new RuntimeException(e); } } /** * 从指定的 QRCode 图像对象中解析出其内容。 * * @param qrcodeImage QRCode 图像对象 * @return QRCode 中的内容 */ public static String from(BufferedImage qrcodeImage) { final LuminanceSource source = new BufferedImageLuminanceSource(qrcodeImage); final BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); String content; try { Result result = new QRCodeReader().decode(bitmap); content = result.getText(); } catch (NotFoundException e) { throw new RuntimeException(e); } catch (ChecksumException e) { throw new RuntimeException(e); } catch (FormatException e) { throw new RuntimeException(e); } return content; } private String getSuffixName(File file) { String path = file.getAbsolutePath(); if (Strings.isNullOrEmpty(path)) { return this.format.getImageFormat(); } int pos = path.lastIndexOf('.'); if (-1 == pos) { return this.format.getImageFormat(); } return path.substring(pos + 1).toUpperCase(); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy