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';//容錯級別