java生成二维码

来源:互联网 发布:印度实力知乎 编辑:程序博客网 时间:2024/05/24 15:41

现在比较有名的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();    }}



0 0
原创粉丝点击