亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統(tǒng) > Android > 正文

Android平臺生成二維碼并實現(xiàn)掃描 & 識別功能

2019-10-23 20:36:57
字體:
來源:轉載
供稿:網(wǎng)友

1.二維碼的前世今生

“二維條碼/二維碼(2-dimensional bar code)是用某種特定的幾何圖形按一定規(guī)律在平面(二維方向上)分布的黑白相間的圖形記錄數(shù)據(jù)符號信息的;在代碼編制上巧妙地利用構成計算機內(nèi)部邏輯基礎的“0”、“1”比特流的概念,使用若干個與二進制相對應的幾何形體來表示文字數(shù)值信息,通過圖象輸入設備或光電掃描設備自動識讀以實現(xiàn)信息自動處理:它具有條碼技術的一些共性:每種碼制有其特定的字符集;每個字符占有一定的寬度;具有一定的校驗功能等。同時還具有對不同行的信息自動識別功能、及處理圖形旋轉變化點。 [1] ”

上面是百度百科的解釋。既然有二維碼,那么肯定有一維碼。

一維碼。最為常見的就是食品 & 書本后面的條碼。

條碼起源與20世紀40年代,后來在1970年 UPC碼發(fā)明,并開始廣泛應用與食品包裝。

具體的介紹可以看百度百科 一維碼。

其實二維碼與一維碼本質上是類似的,就跟一維數(shù)組和二維數(shù)組一樣。

2.二維碼的java支持庫

為了讓java或者說android方便繼承條碼的功能,google就開發(fā)了一個zxing的庫:

https://github.com/zxing/zxing

3.生成二維碼

public class EncodeThread {public static void encode(final String url, final int width, final int height, final EncodeResult result) {if (result == null) {return;}if (TextUtils.isEmpty(url)) {result.onEncodeResult(null);return;}new Thread() {@Overridepublic void run() {try {MultiFormatWriter writer = new MultiFormatWriter();Hashtable<EncodeHintType, String> hints = new Hashtable<>();hints.put(EncodeHintType.CHARACTER_SET, "utf-8");BitMatrix bitMatrix = writer.encode(url, BarcodeFormat.QR_CODE, width, height, hints);Bitmap bitmap = parseBitMatrix(bitMatrix);result.onEncodeResult(bitmap);return;} catch (WriterException e) {e.printStackTrace();}result.onEncodeResult(null);}}.start();}/*** 生成二維碼內(nèi)容<br>** @param matrix* @return*/public static Bitmap parseBitMatrix(BitMatrix matrix) {final int QR_WIDTH = matrix.getWidth();final int QR_HEIGHT = matrix.getHeight();int[] pixels = new int[QR_WIDTH * QR_HEIGHT];//this we using qrcode algorithmfor (int y = 0; y < QR_HEIGHT; y++) {for (int x = 0; x < QR_WIDTH; x++) {if (matrix.get(x, y)) {pixels[y * QR_WIDTH + x] = 0xff000000;} else {pixels[y * QR_WIDTH + x] = 0xffffffff;}}}Bitmap bitmap = Bitmap.createBitmap(QR_WIDTH, QR_HEIGHT, Bitmap.Config.ARGB_8888);bitmap.setPixels(pixels, 0, QR_WIDTH, 0, 0, QR_WIDTH, QR_HEIGHT);return bitmap;}public interface EncodeResult {void onEncodeResult(Bitmap bitmap);}} 

zxing 支持很多條碼格式:我們這里使用QR_CODE碼。也就是我們常見的微信里面的二維碼。

我們先來分析下這段代碼:

MultiFormatWriter writer = new MultiFormatWriter();

這個是一個工具類,把所有支持的幾個write寫在里面了。

public BitMatrix encode(String contents,BarcodeFormat format,int width, int height,Map<EncodeHintType,?> hints) throws WriterException {Writer writer;switch (format) {case EAN_8:writer = new EAN8Writer();break;case UPC_E:writer = new UPCEWriter();break;case EAN_13:writer = new EAN13Writer();break;case UPC_A:writer = new UPCAWriter();break;case QR_CODE:writer = new QRCodeWriter();break;case CODE_39:writer = new Code39Writer();break;case CODE_93:writer = new Code93Writer();break;case CODE_128:writer = new Code128Writer();break;case ITF:writer = new ITFWriter();break;case PDF_417:writer = new PDF417Writer();break;case CODABAR:writer = new CodaBarWriter();break;case DATA_MATRIX:writer = new DataMatrixWriter();break;case AZTEC:writer = new AztecWriter();break;default:throw new IllegalArgumentException("No encoder available for format " + format);}return writer.encode(contents, format, width, height, hints);} 

這是官方最新支持的格式,具體看引入的jar里面支持的格式。

對與bitmatrix的結果,通過摸個算法,設置每個點白色,或者黑色。

最后創(chuàng)建一張二維碼的圖片。

4.識別二維碼

如何從一張圖片上面,識別二維碼呢:

public class ReDecodeThread {public static void encode(final Bitmap bitmap, final ReDecodeThreadResult listener) {if (listener == null) {return;}if (bitmap == null) {listener.onReDecodeResult(null);return;}new Thread() {@Overridepublic void run() {try {MultiFormatReader multiFormatReader = new MultiFormatReader();BitmapLuminanceSource source = new BitmapLuminanceSource(bitmap);BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source));Result result1 = multiFormatReader.decode(bitmap1);listener.onReDecodeResult(result1.getText());return;} catch (NotFoundException e) {e.printStackTrace();}listener.onReDecodeResult(null);}}.start();}public interface ReDecodeThreadResult {void onReDecodeResult(String url);}} 

過程也是很簡單,使用MultiFormatReader來分析圖片,這里不需要缺人圖片的條碼格式。

如果分析下源碼,就是依次使用每種格式的reader來分析,直到找到合適的為止。

當然回了能夠把Bitmap轉化成Bitmatrix,然后在分析。

public final class BitmapLuminanceSource extends LuminanceSource{private final byte[] luminances;public BitmapLuminanceSource(String path) throws FileNotFoundException {this(loadBitmap(path));}public BitmapLuminanceSource(Bitmap bitmap) {super(bitmap.getWidth(), bitmap.getHeight());int width = bitmap.getWidth();int height = bitmap.getHeight();int[] pixels = new int[width * height];bitmap.getPixels(pixels, 0, width, 0, 0, width, height);// In order to measure pure decoding speed, we convert the entire image// to a greyscale array// up front, which is the same as the Y channel of the// YUVLuminanceSource in the real app.luminances = new byte[width * height];for (int y = 0; y < height; y++) {int offset = y * width;for (int x = 0; x < width; x++) {int pixel = pixels[offset + x];int r = (pixel >> 16) & 0xff;int g = (pixel >> 8) & 0xff;int b = pixel & 0xff;if (r == g && g == b) {// Image is already greyscale, so pick any channel.luminances[offset + x] = (byte) r;} else {// Calculate luminance cheaply, favoring green.luminances[offset + x] = (byte) ((r + g + g + b) >> 2);}}}}@Overridepublic 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];}System.arraycopy(luminances, y * width, row, 0, width);return row;}// Since this class does not support cropping, the underlying byte array// already contains// exactly what the caller is asking for, so give it to them without a copy.@Overridepublic byte[] getMatrix() {return luminances;}private static Bitmap loadBitmap(String path) throws FileNotFoundException {Bitmap bitmap = BitmapFactory.decodeFile(path);if (bitmap == null) {throw new FileNotFoundException("Couldn't open " + path);}return bitmap;}} 

5.掃描二維碼

掃描二維碼,其實比上面只多了一步,就是把camera獲取的東西直接轉換,然后進行識別。

public void requestPreviewFrame(Handler handler, int message) {if (camera != null && previewing) {previewCallback.setHandler(handler, message);if (useOneShotPreviewCallback) {camera.setOneShotPreviewCallback(previewCallback);} else {camera.setPreviewCallback(previewCallback);}}} 

首先把camera預覽的數(shù)據(jù)放入previewCallback中。

final class PreviewCallback implements Camera.PreviewCallback public void onPreviewFrame(byte[] data, Camera camera) {Point cameraResolution = configManager.getCameraResolution();if (!useOneShotPreviewCallback) {camera.setPreviewCallback(null);}if (previewHandler != null) {Message message = previewHandler.obtainMessage(previewMessage, cameraResolution.x,cameraResolution.y, data);message.sendToTarget();previewHandler = null;} else {Log.d(TAG, "Got preview callback, but no handler for it");}} 

可以看到,預覽的數(shù)據(jù)data,回傳遞過來,然后handler的方式傳遞出去。

接收data的地方:

@Overridepublic void handleMessage(Message message) {switch (message.what) {case R.id.decode://Log.d(TAG, "Got decode message");decode((byte[]) message.obj, message.arg1, message.arg2);break;case R.id.quit:Looper.myLooper().quit();break;}} 

然后是decode data

private void decode(byte[] data, int width, int height) {long start = System.currentTimeMillis();Result rawResult = null;//modify herebyte[] rotatedData = new byte[data.length];for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++)rotatedData[x * height + height - y - 1] = data[x + y * width];}int tmp = width; // Here we are swapping, that's the difference to #11width = height;height = tmp;PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(rotatedData, width, height);BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));try {rawResult = multiFormatReader.decodeWithState(bitmap);} catch (ReaderException re) {// continue} finally {multiFormatReader.reset();}if (rawResult != null) {long end = System.currentTimeMillis();Log.d(TAG, "Found barcode (" + (end - start) + " ms):/n" + rawResult.toString());Message message = Message.obtain(activity.getHandler(), R.id.decode_succeeded, rawResult);Bundle bundle = new Bundle();bundle.putParcelable(DecodeThread.BARCODE_BITMAP, source.renderCroppedGreyscaleBitmap());message.setData(bundle);//Log.d(TAG, "Sending decode succeeded message...");message.sendToTarget();} else {Message message = Message.obtain(activity.getHandler(), R.id.decode_failed);message.sendToTarget();}} 

當把camera上的圖片轉換成BinaryBitmap以后,剩下的事情,就更直接從圖片識別是一樣的。

PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(rotatedData, width, height);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));


注:相關教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
91精品国自产在线观看| 日韩黄色在线视频| 久久久国产一级片| 国产精品igao网网址不卡| 亚洲老妇色熟女老太| 永久免费未满蜜桃| 国产女人水真多18毛片18精品视频| 高清久久精品| 日本高清不卡在线| 欧洲一级黄色片| 日韩视频第二页| 黑人と日本人の交わりビデオ| 丰满的亚洲女人毛茸茸| 国产男女激情视频| 福利视频网站一区二区三区| 精品一区二区三区欧美| 国产日产精品一区| 成人免费淫片95视频观看网站| 麻豆传传媒久久久爱| 久久久久无码精品国产sm果冻| 色综合久久中文综合久久97| 亚洲国产果冻传媒av在线观看| 懂色av一区二区在线播放| 精品久久久久久久久久| 国产最新免费视频| 蜜桃臀av在线| 青青草免费观看完整版高清| 亚洲一二三级电影| 三级在线免费看| 亚洲成人精品在线观看| 天堂中文8资源在线8| 亚洲国产精品久久久久久6q| 你懂的在线观看网站| 亚洲人辣妹窥探嘘嘘| 亚洲精品水蜜桃| 视频一区在线免费看| 亚洲成人午夜电影| 日本xxxxxxxxxx75| 好想男人揉我下面好多水| 在线亚洲激情| 亚洲欧美一区二区三区久本道91| 久久6免费视频| 色呦呦久久久| 中文字幕精品在线播放| 日韩一区二区在线播放| 日韩精品电影一区亚洲| 777精品伊人久久久久大香线蕉| 欧美一区二区福利| 亚洲热在线视频| 欧美主播一区二区三区美女| 欧美日韩在线视频一区二区三区| 国产精品swag| 久久资源亚洲| 久久精品国产精品青草| 在线性视频日韩欧美| 中文字幕一区图| 色999日韩国产欧美一区二区| 成人一区二区av| 亚洲精品人成网在线播放影院| 精品女同一区二区三区| 青青草97国产精品免费观看| 91av免费看| 久久久久99精品一区| 中文字幕亚洲激情| 精品人妻一区二区三区香蕉| 91小视频在线观看| 日本在线免费中文字幕| 日本性爱视频在线观看| 日韩理论在线| 7777奇米亚洲综合久久| 久久看片网站| 国产女人高潮时对白| 2018国产精品视频| 免费观看的成年网址| 中文国产字幕在线观看| 亚洲综合激情另类小说区| www.com久久久| 粉嫩av亚洲一区二区图片| 国产高清视频网站| 亚洲精品在线不卡| 在线亚洲人成| 精品国产91久久久久久浪潮蜜月| 中国女人一级一次看片| 在线看国产一区二区| 中文字幕在线播放日韩| 亚洲熟女乱色一区二区三区久久久| 日韩欧美中文字幕制服| xxxxxx欧美| 亚洲7777| 午放福利视频在线播放| 熟妇人妻va精品中文字幕| 欧美日韩在线免费视频| 欧美精品一区二区三区视频| 51成人做爰www免费看网站| 欧美国产高潮xxxx1819| 91精品国产自产在线| 日韩人妻精品中文字幕| 超碰在线超碰在线| 樱花视频在线免费观看| 国产精品久久久久久久裸模| 国产在线精品免费| 日韩黄色网址| 亚洲最大网站| www..com.cn蕾丝视频在线观看免费版| 日韩少妇裸体做爰视频| 亚洲美女高潮久久久| 亚洲经典三级| 久久久蜜桃精品| 日韩中文有码在线视频| 激情丁香久久| 国产精品一级黄| 国产精品久久久久aaaa樱花| aa视频在线播放| 精品日韩av一区二区| 黄色高清视频在线观看| 99热这里只有精品首页| 亚洲日本乱码在线观看| 男女羞羞视频在线观看| 成人h动漫精品一区二区下载| 中文一区一区三区免费在线观看| 日韩精品欧美激情| 伊人婷婷久久| 黄色污网站在线观看| 一本本久综合久久爱| 影音先锋导航| 日本久久久久久久| 亚洲欧美日韩精品久久久久| 国产精品美女久久久久久久网站| 在线看片国产福利你懂的| 中文字幕精品久久久| 国产精品亚洲一区二区三区妖精| 国产精品99久| 精品国产乱码久久久久久夜甘婷婷| 国产精品久久久久久在线观看| 成人影院午夜久久影院| 午夜在线观看视频网站| 欧美又大又硬又粗bbbbb| 国产无遮挡在线视频免费观看| 永久免费在线看片视频| 午夜亚洲影视| 久久夜色精品国产| 久青草视频在线观看| 欧美性猛交99久久久久99按摩| 狠狠躁夜夜躁人人爽天天天天97| a毛片毛片av永久免费| 成人18精品视频| 久久在线观看| 国产第一页浮力| 国产91一区二区三区| 亚洲免费婷婷| 国产直播在线| av黄在线观看| 日韩在线观看成人| 国产区一区二区| 性直播体位视频在线观看| 日韩欧美一区中文| 国产一区二区精品在线观看| 国产精品入口麻豆高清| 久久综合网导航| 日韩精品免费在线| 97久久久久久| 国产麻豆日韩| 日韩美女视频一区| 国产区二精品视| 黄色污在线观看| 国产亚洲欧洲997久久综合| 日本欧美在线视频免费观看| 日本高清视频在线播放| 天天色天天操综合| 色乱码一区二区三区熟女| 国产欧美久久久久| 亚洲综合激情六月婷婷在线观看| 精品三级在线观看| 妞干网在线视频| 一区二区三区**美女毛片| 老色鬼在线视频| 欧美 日韩 国产精品| 伊人婷婷欧美激情| 国产真实生活伦对白| 美女国产一区二区三区| 国产拍欧美日韩视频二区| 国产一级做a爰片久久毛片男| 精品视频一区二区| 欧美大荫蒂xxx| 色哟哟一一国产精品| 永久免费无码av网站在线观看| 日韩福利二区| 老司机一区二区| 蜜桃视频无码区在线观看| 亚洲天堂av网站| 亚洲福利精品视频| 国内精品久久久久久久果冻传媒| 在线欧美不卡| 韩国三级大全久久网站| 亚洲一卡二卡在线观看| 九九热精品免费视频| www欧美在线观看| 2023国产精品久久久精品双| 性色88av老女人视频| 精品国产欧美一区二区| 尤物网站在线看| 99热精品在线观看| 在线精品福利| 综合视频一区| 九九九精品视频| 久久久精品国产99久久精品芒果| 91中文字幕在线观看| 全彩无遮拦全彩口工漫画全彩| 国产区在线观看成人精品| free性欧美hd另类精品| 成人aaaa免费全部观看| 你懂得在线观看| 欧美视频日韩视频在线观看| 亚洲精品久久久北条麻妃| 国产又黄又猛又粗| 婷婷中文字幕综合| 2020欧美日韩在线视频| 99热国产在线观看| 一区二区三区四区在线免费观看| 波多野结衣国产精品| 欧美一区二区三区久久综| 91丨九色丨蝌蚪富婆spa| 亚洲天堂一区在线观看| 少妇精品导航| 国产精品麻豆成人av电影艾秋| 色婷婷一区二区三区av免费看| 久久影院免费观看| 欧美高清中文字幕| 2023av在线| 日韩在线观看免费全| 日韩精品免费一区二区三区| 午夜国产福利视频| 亚洲精品伊人| 日韩精品一区不卡| 美女精品在线| 一本一道久久a久久综合蜜桃| 成人性教育视频在线观看| 久久精品第一页| 国产精品一区二区久久久| 亚洲午夜久久久久久久久电影院| 无人码人妻一区二区三区免费| 精品69视频一区二区三区Q| 久久久成人av毛片免费观看| 国产乱人伦真实精品视频| 99视频精品免费| 中文字幕不卡在线视频极品| 思思99精品视频在线观看| аⅴ资源天堂资源库在线| 欧美1区2区3| 污视频网站在线播放| 最近更新的2019中文字幕| 精品福利在线观看| 精品一区二区三区无码视频| 国产精品av免费观看| 免费看的黄网站| 一区二区免费av| 欧美成熟毛茸茸复古| jizzjizz国产精品喷水| 日日骚久久av| 国产剧情麻豆剧果冻传媒视频免费| 蜜芽视频在线观看| 久久精品免费一区二区三区| 色狠狠久久av五月综合| 久久综合伊人77777蜜臀| www·91·com| 成人精品国产亚洲| 欧美日韩久久久久久| 中文字幕日韩国产| 日本电影一区二区在线观看| 欧美人妇做爰xxxⅹ性高电影| 日韩视频亚洲视频| 57pao成人永久免费视频| 综合色婷婷一区二区亚洲欧美国产| 777久久久精品一区二区三区| 1024精品合集| 国产精品黄页免费高清在线观看| 国产自偷自偷免费一区| 中文字幕五月欧美| 人人香蕉久久| 国产美女免费观看| 日本xxx在线播放| 欧美freesex| av第一福利在线导航| 影音先锋日韩有码| 99久久精品日本一区二区免费| 宅男视频免费在线观看视频| 黄色一区二区在线观看| 亚洲欧美影音先锋| 视频区 图片区 小说区| 成年网站在线视频网站| 国产精品视频一区国模私拍| 91精品在线国产| yw193.com尤物在线| 在线电影中文日韩| 成人三级视频在线观看一区二区| 又长又粗又大又爽| 在线播放不卡| 亚洲精品a区| 日本网站免费在线观看| 超碰在线caoporen| 国产 欧美 精品| 亚洲国产精品一区二区www在线| 日韩亚洲欧美视频| 天天操天天爱天天干| 日韩欧美国产精品| www.自拍偷拍| 蜜桃久久av| av电影成人| 中文字幕网站视频在线| 四虎国产精品免费久久5151| 91超碰国产在线| 欧美亚洲禁片免费| 黄色成人在线免费| 第一次破处视频| 欧美成人国产精品高潮| 波多野结衣激情| 精品在线观看入口| 欧美唯美清纯偷拍| 亚洲精品一二三区区别| 亚洲午夜久久久久久尤物| 久久a级毛片毛片免费观看| 欧美裸体xxxx极品少妇| 亚洲午夜久久久久中文字幕| 欧美99在线视频观看| 日本一级片免费看| 亚洲精品综合在线观看| 成人嘿咻视频免费看| 亚洲国产成人久久|