1. 程式人生 > >java生成兩種二維碼

java生成兩種二維碼

   引言

   在這篇部落格中關於二維碼的基本原理先不做介紹,先介紹我們怎樣利用java語言實現二維碼的生成,現在二維

碼在我們生活中已經非常常見了,一言不合就掃碼!所以對於我們這幫程式猿來說,需要研究一把這個東西是怎麼生

成,今天小編就給大家介紹一下,怎樣一步一步生成二維碼的。

  在這給大家介紹兩種二維碼,也是我們在生活中非常常見的兩種,一種就是中間沒有LOGO的二維碼,一種是中間

帶有logo的,當然現在第二種帶有logo的二維碼是非常常見的。

  我們需要引用兩個jar包:core-3.1.0.jar和Qrcode_swetake.jar

 第一個java包也即是zxing.jar 包, 我這裡用的是3.0 版本的core包,是Goole開發的,第二個jar包是用來解碼的

  下面是整個demo的目錄結構

                   

   核心類(BufferedImageLuminanceSource)程式碼:

package com.dmsd.demo;

import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;

import com.google.zxing.LuminanceSource;

public class BufferedImageLuminanceSource extends LuminanceSource {

	private final BufferedImage image;
	private final int left;
	private final int top;

	public BufferedImageLuminanceSource(BufferedImage image) {
		this(image, 0, 0, image.getWidth(), image.getHeight());
	}

	public BufferedImageLuminanceSource(BufferedImage image, int left, int top,
			int width, int height) {
		super(width, height);

		int sourceWidth = image.getWidth();
		int sourceHeight = image.getHeight();
		if (left + width > sourceWidth || top + height > sourceHeight) {
			throw new IllegalArgumentException(
					"Crop rectangle does not fit within image data.");
		}

		for (int y = top; y < top + height; y++) {
			for (int x = left; x < left + width; x++) {
				if ((image.getRGB(x, y) & 0xFF000000) == 0) {
					image.setRGB(x, y, 0xFFFFFFFF); // = white
				}
			}
		}

		this.image = new BufferedImage(sourceWidth, sourceHeight,
				BufferedImage.TYPE_BYTE_GRAY);
		this.image.getGraphics().drawImage(image, 0, 0, null);
		this.left = left;
		this.top = top;
	}

	@Override
	public byte[] getRow(int y, byte[] row) {
		if (y < 0 || y >= getHeight()) {
			throw new IllegalArgumentException(
					"Requested row is outside the image: " + y);
		}
		int width = getWidth();
		if (row == null || row.length < width) {
			row = new byte[width];
		}
		image.getRaster().getDataElements(left, top + y, width, 1, row);
		return row;
	}

	@Override
	public byte[] getMatrix() {
		int width = getWidth();
		int height = getHeight();
		int area = width * height;
		byte[] matrix = new byte[area];
		image.getRaster().getDataElements(left, top, width, height, matrix);
		return matrix;
	}

	@Override
	public boolean isCropSupported() {
		return true;
	}

	@Override
	public LuminanceSource crop(int left, int top, int width, int height) {
		return new BufferedImageLuminanceSource(image, this.left + left,
				this.top + top, width, height);
	}

	@Override
	public boolean isRotateSupported() {
		return true;
	}

	@Override
	public LuminanceSource rotateCounterClockwise() {

		int sourceWidth = image.getWidth();
		int sourceHeight = image.getHeight();

		AffineTransform transform = new AffineTransform(0.0, -1.0, 1.0, 0.0,
				0.0, sourceWidth);

		BufferedImage rotatedImage = new BufferedImage(sourceHeight,
				sourceWidth, BufferedImage.TYPE_BYTE_GRAY);

		Graphics2D g = rotatedImage.createGraphics();
		g.drawImage(image, transform, null);
		g.dispose();

		int width = getWidth();
		return new BufferedImageLuminanceSource(rotatedImage, top, sourceWidth
				- (left + width), getHeight(), width);
	}

}


  核心類(MatrixToImageWriter)程式碼:

package com.dmsd.demo;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;

import javax.imageio.ImageIO;

import com.google.zxing.common.BitMatrix;

public class MatrixToImageWriter {
	private static final int BLACK = 0xFF000000;
	private static final int WHITE = 0xFFFFFFFF;

	private MatrixToImageWriter() {
	}

	public static BufferedImage toBufferedImage(BitMatrix matrix) {
		int width = matrix.getWidth();
		int height = matrix.getHeight();
		BufferedImage image = new BufferedImage(width, height,
				BufferedImage.TYPE_INT_RGB);
		for (int x = 0; x < width; x++) {
			for (int y = 0; y < height; y++) {
				image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
			}
		}
		return image;
	}

	public static void writeToFile(BitMatrix matrix, String format, File file)
			throws IOException {
		BufferedImage image = toBufferedImage(matrix);
		if (!ImageIO.write(image, format, file)) {
			throw new IOException("Could not write an image of format "
					+ format + " to " + file);
		}
	}

	public static void writeToStream(BitMatrix matrix, String format,
			OutputStream stream) throws IOException {
		BufferedImage image = toBufferedImage(matrix);
		if (!ImageIO.write(image, format, stream)) {
			throw new IOException("Could not write an image of format "
					+ format);
		}
	}

}

   核心類(QRCodeUtil)程式碼:

package com.dmsd.demo;

import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Shape;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.OutputStream;
import java.util.Hashtable;
import java.util.Random;

import javax.imageio.ImageIO;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.Result;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

public class QRCodeUtil {

	 private static final String CHARSET = "utf-8";  
	    private static final String FORMAT_NAME = "JPG";  
	    // 二維碼尺寸  
	    private static final int QRCODE_SIZE = 300;  
	    // LOGO寬度  
	    private static final int WIDTH = 60;  
	    // LOGO高度  
	    private static final int HEIGHT = 60;  
	  
	    private static BufferedImage createImage(String content, String imgPath,  
	            boolean needCompress) throws Exception {  
	        Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();  
	        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);  
	        hints.put(EncodeHintType.CHARACTER_SET, CHARSET);  
	        hints.put(EncodeHintType.MARGIN, 1);  
	        BitMatrix bitMatrix = new MultiFormatWriter().encode(content,  
	                BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints);  
	        int width = bitMatrix.getWidth();  
	        int height = bitMatrix.getHeight();  
	        BufferedImage image = new BufferedImage(width, height,  
	                BufferedImage.TYPE_INT_RGB);  
	        for (int x = 0; x < width; x++) {  
	            for (int y = 0; y < height; y++) {  
	                image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000  
	                        : 0xFFFFFFFF);  
	            }  
	        }  
	        if (imgPath == null || "".equals(imgPath)) {  
	            return image;  
	        }  
	        // 插入圖片  
	        QRCodeUtil.insertImage(image, imgPath, needCompress);  
	        return image;  
	    }  
	  
	    /** 
	     * 插入LOGO 
	     *  
	     * @param source 
	     *            二維碼圖片 
	     * @param imgPath 
	     *            LOGO圖片地址 
	     * @param needCompress 
	     *            是否壓縮 
	     * @throws Exception 
	     */  
	    private static void insertImage(BufferedImage source, String imgPath,  
	            boolean needCompress) throws Exception {  
	        File file = new File(imgPath);  
	        if (!file.exists()) {  
	            System.err.println(""+imgPath+"   該檔案不存在!");  
	            return;  
	        }  
	        Image src = ImageIO.read(new File(imgPath));  
	        int width = src.getWidth(null);  
	        int height = src.getHeight(null);  
	        if (needCompress) { // 壓縮LOGO  
	            if (width > WIDTH) {  
	                width = WIDTH;  
	            }  
	            if (height > HEIGHT) {  
	                height = HEIGHT;  
	            }  
	            Image image = src.getScaledInstance(width, height,  
	                    Image.SCALE_SMOOTH);  
	            BufferedImage tag = new BufferedImage(width, height,  
	                    BufferedImage.TYPE_INT_RGB);  
	            Graphics g = tag.getGraphics();  
	            g.drawImage(image, 0, 0, null); // 繪製縮小後的圖  
	            g.dispose();  
	            src = image;  
	        }  
	        // 插入LOGO  
	        Graphics2D graph = source.createGraphics();  
	        int x = (QRCODE_SIZE - width) / 2;  
	        int y = (QRCODE_SIZE - height) / 2;  
	        graph.drawImage(src, x, y, width, height, null);  
	        Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);  
	        graph.setStroke(new BasicStroke(3f));  
	        graph.draw(shape);  
	        graph.dispose();  
	    }  
	  
	    /** 
	     * 生成二維碼(內嵌LOGO) 
	     *  
	     * @param content 
	     *            內容 
	     * @param imgPath 
	     *            LOGO地址 
	     * @param destPath 
	     *            存放目錄 
	     * @param needCompress 
	     *            是否壓縮LOGO 
	     * @throws Exception 
	     */  
	    public static void encode(String content, String imgPath, String destPath,  
	            boolean needCompress) throws Exception {  
	        BufferedImage image = QRCodeUtil.createImage(content, imgPath,  
	                needCompress);  
	        mkdirs(destPath);  
	        String file = new Random().nextInt(99999999)+".jpg";  
	        ImageIO.write(image, FORMAT_NAME, new File(destPath+"/"+file));  
	    }  
	  
	    /** 
	     * 當資料夾不存在時,mkdirs會自動建立多層目錄,區別於mkdir.(mkdir如果父目錄不存在則會丟擲異常) 
	     * @author lanyuan 
	     * Email: [email protected] 
	     * @date 2013-12-11 上午10:16:36 
	     * @param destPath 存放目錄 
	     */  
	    public static void mkdirs(String destPath) {  
	        File file =new File(destPath);      
	        //當資料夾不存在時,mkdirs會自動建立多層目錄,區別於mkdir.(mkdir如果父目錄不存在則會丟擲異常)  
	        if (!file.exists() && !file.isDirectory()) {  
	            file.mkdirs();  
	        }  
	    }  
	  
	    /** 
	     * 生成二維碼(內嵌LOGO) 
	     *  
	     * @param content 
	     *            內容 
	     * @param imgPath 
	     *            LOGO地址 
	     * @param destPath 
	     *            儲存地址 
	     * @throws Exception 
	     */  
	    public static void encode(String content, String imgPath, String destPath)  
	            throws Exception {  
	        QRCodeUtil.encode(content, imgPath, destPath, false);  
	    }  
	  
	    /** 
	     * 生成二維碼 
	     *  
	     * @param content 
	     *            內容 
	     * @param destPath 
	     *            儲存地址 
	     * @param needCompress 
	     *            是否壓縮LOGO 
	     * @throws Exception 
	     */  
	    public static void encode(String content, String destPath,  
	            boolean needCompress) throws Exception {  
	        QRCodeUtil.encode(content, null, destPath, needCompress);  
	    }  
	  
	    /** 
	     * 生成二維碼 
	     *  
	     * @param content 
	     *            內容 
	     * @param destPath 
	     *            儲存地址 
	     * @throws Exception 
	     */  
	    public static void encode(String content, String destPath) throws Exception {  
	        QRCodeUtil.encode(content, null, destPath, false);  
	    }  
	  
	    /** 
	     * 生成二維碼(內嵌LOGO) 
	     *  
	     * @param content 
	     *            內容 
	     * @param imgPath 
	     *            LOGO地址 
	     * @param output 
	     *            輸出流 
	     * @param needCompress 
	     *            是否壓縮LOGO 
	     * @throws Exception 
	     */  
	    public static void encode(String content, String imgPath,  
	            OutputStream output, boolean needCompress) throws Exception {  
	        BufferedImage image = QRCodeUtil.createImage(content, imgPath,  
	                needCompress);  
	        ImageIO.write(image, FORMAT_NAME, output);  
	    }  
	  
	    /** 
	     * 生成二維碼 
	     *  
	     * @param content 
	     *            內容 
	     * @param output 
	     *            輸出流 
	     * @throws Exception 
	     */  
	    public static void encode(String content, OutputStream output)  
	            throws Exception {  
	        QRCodeUtil.encode(content, null, output, false);  
	    }  
	  
	    /** 
	     * 解析二維碼 
	     *  
	     * @param file 
	     *            二維碼圖片 
	     * @return 
	     * @throws Exception 
	     */  
	    public static String decode(File file) throws Exception {  
	        BufferedImage image;  
	        image = ImageIO.read(file);  
	        if (image == null) {  
	            return null;  
	        }  
	        BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(  
	                image);  
	        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));  
	        Result result;  
	        Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>();  
	        hints.put(DecodeHintType.CHARACTER_SET, CHARSET);  
	        result = new MultiFormatReader().decode(bitmap, hints);  
	        String resultStr = result.getText();  
	        return resultStr;  
	    }  
	  
	    /** 
	     * 解析二維碼 
	     *  
	     * @param path 
	     *            二維碼圖片地址 
	     * @return 
	     * @throws Exception 
	     */  
	    public static String decode(String path) throws Exception {  
	        return QRCodeUtil.decode(new File(path));  
	    }  
	  
	    public static void main(String[] args) throws Exception {  
	        String text = "薯 燈可分列式本上楞珂要瓜熟蒂落!000000000000000";  
	        QRCodeUtil.encode(text, "c:/df.jsp", "c:/a/", true);  
	    }  

}

   不帶有logo的測試類(mytest):

package com.dmsd.demo;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;

public class MyTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		 try {
			String content = "https://www.baidu.com";
			 String path = "E:/";
			 
			 MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
			 Map hints = new HashMap();
			 hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
			 BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, 400, 400,hints);
			 File file1 = new File(path,"01.jpg");
			 MatrixToImageWriter.writeToFile(bitMatrix, "jpg", file1);
		} catch (WriterException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}  

}

   帶有logo測試類(TestLogo)程式碼:

package com.dmsd.demo;

public class TestLogo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			String text = "https://www.baidu.com";  
			QRCodeUtil.encode(text, "e:/001.jpg", "e:/image/", true);
		} catch (Exception e) {
			e.printStackTrace();
		}  
	}

}

   對於這個二維碼實現這方面的東西小編也是初始,現在首先是能實現這個東西,對於程式碼還有一些沒有明白,

希望對用到的朋友能有個幫助。

   在下一篇部落格會分析一下二維碼的基本原理!!!!

相關推薦

java生成

   引言    在這篇部落格中關於二維碼的基本原理先不做介紹,先介紹我們怎樣利用java語言實現二維碼的生成,現在二維 碼在我們生活中已經非常常見了,一言不合就掃碼!所以對於我們這幫程式猿來說,需要研究一把這個東西是怎麼生 成,今天小編就給大家介紹一下,怎樣一步一

JAVA生成帶logo的方法

  一、方法一       只使用一個zxing.jar生成二維碼,下載地址http://central.maven.org/maven2/com/google/zxing/core/        

java生成和解析

ade ted image def eat tro per buffer could 前言 現在,二維碼的應用已經非常廣泛,在線生成器也是諸多,隨手生成。 所以就和大家分享一個小案例,用zxing來做一個的二維碼生成器,當然這個例子是比較簡單,若是寫的不好請多多包涵。

使用JAVA生成以及解析

生成和解析二維碼需要用到第三方的包: QRCODE.jar,點選此處下載 二維碼如何實現不用關心,只用關心兩個方法: 把字串寫進二維碼,並且生成圖片到destFile public static void qrCodeEncode(String encodeddata, File des

Java 生成vCard名片(利用zxing開源專案)

宣告:其中部分內容來自其他博文!!!  package com.arcode; import java.io.File; import java.nio.file.Path; import java.util.HashMap; import java.util.Map; imp

六步教你用Java生成自己專屬

小夥伴們,今天來教教大家如何製作二維碼。相信大家之前也做過二維碼,不過應該都是自動生成的,小姐姐之前也是這樣的,不過作為一個程式媛,當然得自己敲程式碼納! 二維碼原理 1.類別介紹 線性堆疊式二維碼 矩陣式二維碼 郵政碼 線性堆疊式二維碼 原理:建立在一維條碼之上

java生成小程式

直接上程式碼 public class XcxQRCode { static String APPID = "";//自己的appid static String SECRET = ""; /** * 生成二維碼 * Folder:資料夾路徑 *

JAVA實現QRCode的生成以及列印(轉)

不說廢話了直接上程式碼 注意使用QRCode是需要zxing的核心jar包,這裡給大家提供下載地址 https://download.csdn.net/download/dsn727455218/10515340 下載 1.二維碼的工具類   public class QR_Cod

Java 使用QRCode.jar生成與解析

宣告:部分程式碼來自慕課網!!! https://files.cnblogs.com/files/bigroc/QRCode.zip 也可以自己下載壓縮包: 1、生成(中文網站打不開,建議開啟英文(en)網站):http://www.swetake.com/qrcode/index-

java 介面實現壓縮後的生成多張

pom的jar包: <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version&

Java微信公眾平臺開發之生成帶參

微信官方提供的生成二維碼介面得到的是當前公眾號的二維碼。 目前有2種類型的二維碼: 1、臨時二維碼,是有過期時間的,最長可以設定為在二維碼生成後的30天(即2592000秒)後過期,但能夠生成較多數量,主要用於帳號繫結等不要求二維碼永久儲存的業務場景 2

java利用qrcode.jar進行處理生成、解析

首先,這裡貼出jar。 生成二維碼: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

PHP 生成、識別

play github 開源軟件 eve tps sage compose example 電子郵件 溫馨提示:經過這 2 天的折騰,我卸載了 php7.1。原因只有一個——我要安裝的條形碼擴展模塊 php-zbarcode 的 c 語言源代碼不支持

用zxing生成和解析

ont 跳轉 char log trac -s ioe hints pan package test; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOExceptio

python生成動態個性

字符串 技術分享 參數 qrc 就是 ash 我想 一起 .com 1 安裝工具2 生成普通二維碼3 帶圖片的二維碼4 動態 GIF 二維碼5 在Python程序中使用 一、安裝 首先在python環境下運行, 打開cmd進入python27 進入scripts 然後在

使用zxing生成和解析

關於二維碼   一. 二維碼的分類     線性堆疊式二維碼、矩陣式二維碼、郵政碼。 二. 二維碼的優缺點     優點:1. 高密度編碼,資訊容量大;          

基於PHP類庫PHPqrCode生成帶LOGO

PHPqrCode是一個PHP二維碼生成類庫,利用它可以輕鬆生成二維碼,官網提供了下載和多個演示demo,檢視地址:http://phpqrcode.sourceforge.net/。下載官網提供的類庫後,只需要使用phpqrcode.php就可以生成二維碼了,當然您的PHP環境必須開啟支援GD2。

Java使用opencv進行定位、矯正和裁剪

例子使用的版本為3.4.0,安裝配置網上資料比較多。 程式碼為本地測試時候的版本,所以會有點亂。 import org.opencv.core.*; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; i

thinkphp 使用phpqrcode生成帶logo生成海報

1-下載類庫 composer require aferrandini/phpqrcode -vvv 2-common的方法 //$text 文字的內容 //$logo logo圖片 function code($text,$logo){ //二維碼圖片儲存路徑

用phpqrcode生成帶logo, 需注意幾點,不注意是要進坑的哦.

先附上程式碼: include '../vendor/phpqrcode/phpqrcode.php'; $value = 'http://127.0.0.1/txw1958/'; //二維碼內容 $errorCorrectionLevel = 'L';//容錯級別