1. 程式人生 > >二維碼之zxing二維碼解析圖片資源

二維碼之zxing二維碼解析圖片資源

前面講了如何利用zxing生成二維碼影象以及仿照新浪微博方式生成二維碼。接下來,就要開始談到如何利用zxing解析二維碼影象。

zxing針對不同開發平臺,都給出瞭解析二維碼的例子,我這裡只聊聊關於android系統的解析。

對於android手機來說,二維碼影象獲取方式有拍照掃描,以及讀取本地圖片資源。無論是哪種方式,解析過程的核心內容基本是一樣的。關於手機拍照掃描這塊,由於要涉及到很多問題要講,所以我打算把這塊放在下篇文章再細緻講解,這次只講如何對圖片進行解析。

首先,和生成二維碼一樣,我們要告訴系統解析二維碼的設定引數。這裡我選擇了支援主流的三類方式,其中一種為一維碼(條形碼)。設定解析的字元位UTF8。如果不設定字元解析方式,它會自己去識別內容,然後自己判斷該用哪種方式。

看一下設定引數的程式碼:

		MultiFormatReader multiFormatReader = new MultiFormatReader();

		// 解碼的引數
		Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>(
				2);
		// 可以解析的編碼型別
		Vector<BarcodeFormat> decodeFormats = new Vector<BarcodeFormat>();
		if (decodeFormats == null || decodeFormats.isEmpty()) {
			decodeFormats = new Vector<BarcodeFormat>();

			// 這裡設定可掃描的型別,我這裡選擇了都支援
			decodeFormats.addAll(DecodeFormatManager.ONE_D_FORMATS);
			decodeFormats.addAll(DecodeFormatManager.QR_CODE_FORMATS);
			decodeFormats.addAll(DecodeFormatManager.DATA_MATRIX_FORMATS);
		}
		hints.put(DecodeHintType.POSSIBLE_FORMATS, decodeFormats);

		// 設定繼續的字元編碼格式為UTF8
		// hints.put(DecodeHintType.CHARACTER_SET, "UTF8");

		// 設定解析配置引數
		multiFormatReader.setHints(hints);


補一句:zxing原始碼中對UTF8的定義字串內容不是UTF-8,而是UTF8。
private static final String UTF8 = "UTF8";

再來就是解析部分:

		// 開始對影象資源解碼
		Result rawResult = null;
		try {

			rawResult = multiFormatReader
					.decodeWithState(new BinaryBitmap(new HybridBinarizer(
							new BitmapLuminanceSource(BitmapFactory
									.decodeResource(getResources(),
											R.drawable.weibo)))));
		} catch (NotFoundException e) {
			e.printStackTrace();
		}


按照zxing的解碼規則,需要傳入一個LuminanceSource類的物件,最後就會得到解析結果result物件,也就是解碼後的資訊類。這裡唯一需要自己實現的就是BitmapLuminanceSource類。

BitmapLuminanceSource繼承自LuminanceSource這個抽象類,需要實現它的構造方法,並重載getMatrix()和getRow(int y, byte[] row)方法。其構造方法中需要傳入寬高,這兩個值指的就是圖片的寬和高。getMatrix()方法會返回一個byte陣列,這個陣列就是圖片的畫素陣列。getRow(int y, byte[] row)如字面的意義,就是得到圖片畫素陣列的一行。其中的y就是需要的哪一個行的畫素陣列。

先看構造方法:

	protected BitmapLuminanceSource(Bitmap bitmap) {
		super(bitmap.getWidth(), bitmap.getHeight());

		// 首先,要取得該圖片的畫素陣列內容
		int[] data = new int[bitmap.getWidth() * bitmap.getHeight()];
		this.bitmapPixels = new byte[bitmap.getWidth() * bitmap.getHeight()];
		bitmap.getPixels(data, 0, getWidth(), 0, 0, getWidth(), getHeight());

		// 將int陣列轉換為byte陣列
		for (int i = 0; i < data.length; i++) {
			this.bitmapPixels[i] = (byte) data[i];
		}
	}

注意:這裡的byte陣列是指圖片的畫素陣列,而不是所謂Bitmap轉換成byte陣列,有人出現解析的錯誤,大多是對這個引數用途沒理解造成的。

Bitmap物件的getPixels方法可以取得的畫素陣列,但它得到是int型陣列。根據其api文件解釋,取得的是color,也就是畫素顏色值。每個畫素值包含透明度,紅色,綠色,藍色。所以白色就是0xffffffff,黑色就是0xff000000。直接由int型轉成byte型,實現上相當於我們這裡只取其藍色值部分。

再來就是getRow方法:

	@Override
	public byte[] getRow(int y, byte[] row) {
		// 這裡要得到指定行的畫素資料
		System.arraycopy(bitmapPixels, y * getWidth(), row, 0, getWidth());
		return row;
	}


補充:getPixels得到的畫素陣列是一維的,也就是按照圖片寬度逐行取畫素顏色值錄入。如果想得到單行的畫素陣列內容,通過y*width就可以找該行的第一個畫素值,拷貝後面width個就可以得到該行的畫素內容。

最後一個就是getMatrix()方法,它用來返回我們的影象轉換成的畫素陣列。

	@Override
	public byte[] getMatrix() {
		// 返回我們生成好的畫素資料
		return bitmapPixels;
	}


以下是完整的BitmapLuminanceSource類:

  public class BitmapLuminanceSource extends LuminanceSource {

	private byte bitmapPixels[];

	protected BitmapLuminanceSource(Bitmap bitmap) {
		super(bitmap.getWidth(), bitmap.getHeight());

		// 首先,要取得該圖片的畫素陣列內容
		int[] data = new int[bitmap.getWidth() * bitmap.getHeight()];
		this.bitmapPixels = new byte[bitmap.getWidth() * bitmap.getHeight()];
		bitmap.getPixels(data, 0, getWidth(), 0, 0, getWidth(), getHeight());

		// 將int陣列轉換為byte陣列,也就是取畫素值中藍色值部分作為辨析內容
		for (int i = 0; i < data.length; i++) {
			this.bitmapPixels[i] = (byte) data[i];
		}
	}

	@Override
	public byte[] getMatrix() {
		// 返回我們生成好的畫素資料
		return bitmapPixels;
	}

	@Override
	public byte[] getRow(int y, byte[] row) {
		// 這裡要得到指定行的畫素資料
		System.arraycopy(bitmapPixels, y * getWidth(), row, 0, getWidth());
		return row;
	}
}


好了,最後就得到了我們想要的Result物件。
這個物件中包含了很多內容,包括內容,編碼方式,解析時間等。
我們想要的內容就放在rawResult.getText()中,你還可以得到它的編碼方式rawResult.getBarcodeFormat()。

專案截圖:

工程例子已經更新,有需要的朋友可以點選連結下載

相關推薦

zxing解析圖片資源

前面講了如何利用zxing生成二維碼影象以及仿照新浪微博方式生成二維碼。接下來,就要開始談到如何利用zxing解析二維碼影象。 zxing針對不同開發平臺,都給出瞭解析二維碼的例子,我這裡只聊聊關於android系統的解析。 對於android手機來說,二維碼影象獲取方式有

Java生成 ZXing

  前幾天突然有個新的想法,給某個程式設計師送禮物的想法,程式設計師的浪漫(誤)。所以特地去學了一下二維碼生成相關知識,還買了個域名。生成二維碼的方式有好幾種,這次用的是zxing來生成的。   很簡單,接下來就放一下程式碼。有關二維碼相關原理看了一下這位大佬的文章:https://coolshell.cn

叉樹完全叉樹判斷

分析:可以按照下面條件進行判斷  1. 採用按層遍歷的方式,依次遍歷所有結點  2. 如果當前結點有右孩子沒有左孩子,直接返回false  3. 如果當前結點有左孩子沒有右孩子,那之後的結點必須為葉子結點,否則返回false  4. 如果之前步

掃描zxing與zbar

二維碼掃描在日常的使用中非常廣泛,特總結一波,並比較zxing與zbar的優劣之處 zxing與zbar對比: 1.zxing是谷歌開源,專案地址為:https://github.com/zxing/zxing,仍在維護,採用C++編寫。zbar則是主要用C來寫的,速度極快

C# ZXing.Net生成、識別、生成帶Logo的(一)

tree bit 字符串 單位 images j2se lba 支付 .net 一.ZXing.Net 源代碼地址:http://zxingnet.codeplex.com/ 也可以使用Nuget包管理,添加如圖: 說明:ZXing是一個開源Java類庫用於解析多種格式的

Android工具zxing使用

bit imageview bitmap spl mage word static factor stc 二維碼在我們生活中隨處可見。在我眼裏簡直能夠用“泛濫”來形容啦。那怎樣在我們Android項目中掃描識別二維碼或生成二維碼圖片呢? 我們通常使用的開

Zxing掃描

ram zxing oss lean 預覽 surface ott serial pac 源代碼地址 有問題能夠加QQ:312122330 之前對於Zbar的二位碼掃描。到項目上線以後才發現掃描過於靈敏。導致有時候掃描到半截就啟動了。 後來翻看ZXIN

【java】google的zxing架包生成和讀取【可帶文字和logo】

oms cga dispose framework 增加 span 記錄 ora obj 承接RC4生成不重復字符串的需求之後,因為優惠碼要方便用戶使用的緣故,所以思來想去,覺得還是直接生成二維碼給用戶直接掃比較實用,也不用用戶專門記錄冗長的優惠碼編號。 =========

Android項目實戰(四十四):Zxing切換橫屏掃描

pla xxx mage tde min bar 分享圖片 spl 發現 原文:Android項目實戰(四十四):Zxing二維碼切換橫屏掃描Demo鏈接 默認是豎屏掃描,但是當我們在清單文件中配置橫屏顯示的時候: <activity

Android ZXing掃一掃

大概效果如下 測試的時候使用6.0有點問題,點選掃一掃會出現閃退的現象,使用更高版本的就不會出現這種現象 具體解決方法可查詢度娘 因為在模擬器上測試部分效果沒有展示,但是在真機上測試過完全可以使用 注意一點 動態許可權 要在根的build.gradle裡面加入 在專案的build.gra

Zxing掃描的整合與優化

Zxing已經是一個很成熟的框架了,但它是用maven構建的專案,在以gradle為基礎的AS中整合起來總感覺不太方便。網上有很多種方式,我這裡主要採取了複製程式碼到自己專案中的方式,這樣有利於學習和擴充套件。 第一步:整合 官方專案地址:https://github.com

友盟整合第三方登入 + 登入註冊 + 跑馬燈 + Zxing

如圖: 第一步:建立工程 整合友盟第三方,建立工程時,包名:com.umeng.soexample 第二步:添加回調Activity 主要是qq和微信的回撥 第三步:匯入jar和res 將main資料夾以及platform(選擇你想使用的平臺即可)檔案下,對應的資原始檔和ja

框架Zxing實現文字內容

一 、引入Zxing依賴 <dependency> <groupId>com.google.zxing</groupId> <

java生成與解析

 1.引入依賴 <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</a

掃描 ZXing 基礎

一、新增依賴 implementation 'cn.bingoogolapple:bga-qrcode-zxing:1.2.1' 二、佈局 <?xml version="1.0" encoding="utf-8"?> <android.support.c

Android平臺利用Zxing生成解析圖片中的

轉載請註明http://blog.csdn.net/houkai6/article/details/47102733 1. 生成二維碼 public final class EncodingHandler { private static final int BLACK

VUE開發報錯生成(vue-qr外掛)

近來有幸被安排實現一個生成二維碼預覽的功能,個人感覺挺好玩,就欣然接受了。首先百度了下,發現vue中生成二維碼的外掛還不少呢,用的比較火的,有這麼兩個外掛 vue-qart 和 vue-qr ,對比了下,感覺vue-qr的功能實現起來更加簡單豐富,所以選擇了vue-qr。本人

zxing 大白邊一步一步修復指南(轉)

轉自:開源中國 小灰灰Blog 釋出於 2017/04/03 12:10 二維碼邊距修復 使用zxing生成二維碼時, 某些場景下,即便指定 padding 引數為0,依然有很大的白邊,本篇博文主要分析產生這個的原因,以及如何修復這個問題

zxing 、帶logo生成

<span style="font-size:18px;">普通二維碼生成</span><span style="font-size:18px;">public class ZxingEncoderUtil { /** * 生成二

解決Android掃描ZXing豎屏拉伸變長閃退掃描區域小等問題

這篇文章寫的不錯,但是按照這篇文章使用二維碼的話會出現豎屏掃描影象拉伸變長的問題(有一個地方計算錯誤),解決拉伸變長的問題後又會出現閃退的問題(傳輸大Bitmap物件導致閃退,改為Byte陣列或者不傳遞Bitmap) 其他地方不動,即可完美移植二維碼掃描功能 改動