现在比较有名的java开源二维码工具有google的zxing,本文记录生成常见的qrcode过程
1、加入maven依赖
<!-- zxing -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>2.2</version>
</dependency>
2、java示例
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
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.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
public class QRCodeHelper {
private static final Log logger = LogFactory.getLog(QRCodeHelper.class);
private static final String charset = "UTF-8"; // or "ISO-8859-1"
/**
* 生成二维码图片
* @param qrCodeData 原文字
* @param qrCodeheight 高度
* @param qrCodewidth 宽度
* @return
*/
public static BufferedImage createImage(String qrCodeData, int qrCodeheight, int qrCodewidth){
Map<EncodeHintType, Object> hintMap = new HashMap<EncodeHintType, Object>();
hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);//容错率
hintMap.put(EncodeHintType.MARGIN, 0);//外边距
BitMatrix matrix = null;
try {
matrix = new MultiFormatWriter().encode(
new String(qrCodeData.getBytes(charset), charset),
BarcodeFormat.QR_CODE, qrCodewidth, qrCodeheight, hintMap);
} catch (UnsupportedEncodingException e) {
logger.error(e.getMessage());
} catch (WriterException e) {
logger.error(e.getMessage());
}
return MatrixToImageWriter.toBufferedImage(matrix);
}
/**
* 读取二维码
* @param filePath 文件路径
* @param charset 文件编码
* @param hintMap 二维码配置
* @return
* @throws FileNotFoundException
* @throws IOException
* @throws NotFoundException
*/
public static String readQRCode(String filePath, String charset, Map hintMap)
throws FileNotFoundException, IOException, NotFoundException {
BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(
new BufferedImageLuminanceSource(
ImageIO.read(new FileInputStream(filePath)))));
Result qrCodeResult = new MultiFormatReader().decode(binaryBitmap,
hintMap);
return qrCodeResult.getText();
}
}
该程序生成的二维码可以在网页上面显示,可以被大部分二维码工具扫描,若想在纸张或者海报上,还需要调整图片的分辨率。java 有生成tif格式图片的工具JAI_ImageIO_1.1,需要加入JAI_ImageIO_1.1.jar包,下载地址 http://download.csdn.net/detail/ccl_space/7029687
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.util.Iterator;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOInvalidTreeException;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.metadata.IIOMetadataNode;
import javax.imageio.stream.FileImageOutputStream;
import com.sun.media.imageio.plugins.tiff.BaselineTIFFTagSet;
import com.sun.media.imageio.plugins.tiff.TIFFDirectory;
import com.sun.media.imageio.plugins.tiff.TIFFField;
import com.sun.media.imageio.plugins.tiff.TIFFTag;
/**
* 设置自定义dpi值到TIFF格式图像的样例程序。
* 需要 JAI_ImageIO_1.1 提供支持。
*/
public class SetDPI4TIFF {
private static String METADATA_NAME = "com_sun_media_imageio_plugins_tiff_image_1.0";
private static int DPI_X = 300;
private static int DPI_Y = 300;
public static void main(String[] args) throws Throwable {
// Create sample image.
RenderedImage image = new BufferedImage(256, 256, BufferedImage.TYPE_3BYTE_BGR);
// RenderedImage image = ImageIO.read(new File("e:\\700.png"));
// Get TIFF writer.
Iterator writers = ImageIO.getImageWritersByFormatName("TIFF");
if (writers == null || !writers.hasNext()) {
throw new IllegalStateException("No TIFF writers!");
}
ImageWriter writer = (ImageWriter) writers.next();
// Get the default image metadata.
ImageTypeSpecifier imageType = ImageTypeSpecifier.createFromRenderedImage(image);
IIOMetadata imageMetadata = writer.getDefaultImageMetadata(imageType, null);
// Set DPI.
String fileName;
String methodology;
if (args.length == 0 || args[0].equalsIgnoreCase("DOM")) {
fileName = "dpi_dom.tif";
setDPIViaDOM(imageMetadata);
methodology = "DOM";
} else {
fileName = "dpi_api.tif";
imageMetadata = setDPIViaAPI(imageMetadata);
methodology = "API";
}
System.out.println(" Writing " + fileName + " using " + methodology + " methodology ");
// Write image.
writer.setOutput(new FileImageOutputStream(new File(fileName)));
writer.write(new IIOImage(image, null, imageMetadata));
}
/**
* Set DPI using DOM nodes.
*/
private static void setDPIViaDOM(IIOMetadata imageMetadata) throws IIOInvalidTreeException {
// Get the DOM tree.
IIOMetadataNode root = (IIOMetadataNode) imageMetadata.getAsTree(METADATA_NAME);
// Get the IFD.
IIOMetadataNode ifd = (IIOMetadataNode) root.getElementsByTagName("TIFFIFD").item(0);
// Get {X,Y}Resolution tags.
BaselineTIFFTagSet base = BaselineTIFFTagSet.getInstance();
TIFFTag tagXRes = base.getTag(BaselineTIFFTagSet.TAG_X_RESOLUTION);
TIFFTag tagYRes = base.getTag(BaselineTIFFTagSet.TAG_Y_RESOLUTION);
// Create {X,Y}Resolution nodes.
IIOMetadataNode nodeXRes = createRationalNode(tagXRes.getName(), tagXRes.getNumber(), DPI_X, 1);
IIOMetadataNode nodeYRes = createRationalNode(tagYRes.getName(), tagYRes.getNumber(), DPI_Y, 1);
// Append {X,Y}Resolution nodes to IFD node.
ifd.appendChild(nodeXRes);
ifd.appendChild(nodeYRes);
// Set metadata from tree.
imageMetadata.setFromTree(METADATA_NAME, root);
}
/**
* Creates a node of TIFF data type RATIONAL.
*/
private static IIOMetadataNode createRationalNode(String tagName, int tagNumber, int numerator, int denominator) {
// Create the field node with tag name and number.
IIOMetadataNode field = new IIOMetadataNode("TIFFField");
field.setAttribute("name", tagName);
field.setAttribute("number", "" + tagNumber);
// Create the RATIONAL node.
IIOMetadataNode rational = new IIOMetadataNode("TIFFRational");
rational.setAttribute("value", numerator + "/" + denominator);
// Create the RATIONAL node and append RATIONAL node.
IIOMetadataNode rationals = new IIOMetadataNode("TIFFRationals");
rationals.appendChild(rational);
// Append RATIONALS node to field node.
field.appendChild(rationals);
return field;
}
/**
* Set DPI using API.
*/
private static IIOMetadata setDPIViaAPI(IIOMetadata imageMetadata) throws IIOInvalidTreeException {
// Derive the TIFFDirectory from the metadata.
TIFFDirectory dir = TIFFDirectory.createFromMetadata(imageMetadata);
// Get {X,Y}Resolution tags.
BaselineTIFFTagSet base = BaselineTIFFTagSet.getInstance();
TIFFTag tagXRes = base.getTag(BaselineTIFFTagSet.TAG_X_RESOLUTION);
TIFFTag tagYRes = base.getTag(BaselineTIFFTagSet.TAG_Y_RESOLUTION);
// Create {X,Y}Resolution fields.
TIFFField fieldXRes = new TIFFField(tagXRes, TIFFTag.TIFF_RATIONAL, 1, new long[][]{{DPI_X, 1}});
TIFFField fieldYRes = new TIFFField(tagYRes, TIFFTag.TIFF_RATIONAL, 1, new long[][]{{DPI_Y, 1}});
// Append {X,Y}Resolution fields to directory.
dir.addTIFFField(fieldXRes);
dir.addTIFFField(fieldYRes);
// Convert to metadata object and return.
return dir.getAsMetadata();
}
}