java生成二维码

现在比较有名的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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值