1. 程式人生 > >使用ZXing掃碼實現掃手機本地圖片的二維碼內容

使用ZXing掃碼實現掃手機本地圖片的二維碼內容

ZXing這個第三方是我用的第三方,用來掃描二維碼的,之前沒有看到ZXing還提供了掃描本地圖片二維碼的功能,現在整理如下。

跳轉到選取本地圖片的頁面

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("iamge/*");
        startActivityForResult(intent, 300);

然後選取圖片之後來到onActivityResult回撥

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 100) {
            //獲取照片資料
            Bitmap camera = data.getParcelableExtra("data");
            iv1.setImageBitmap(camera);
        }
        if (requestCode == 200) {
            if (data != null) {
                try {
                    Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(data.getData()));
                    iv1.setImageBitmap(bitmap);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
            }
        }
        if (requestCode == 300) {
            String photoPath = getRealFilePath(this, data.getData());
            if (photoPath == null) {
                LogUtil.fussenLog().d("路徑獲取失敗");
            } else {
                //解析圖片
                prasePhoto(photoPath);
            }
        }
    }

我們只用關心requestCode 為  300 的這種情況

裡面有兩個自定義的方法   分別是:

getRealFilePath  方法  和  解析圖片的  prasePhoto 方法

getRealFilePath方法  是用來獲取選取的圖片的絕對地址

這裡直接貼出來方法:

 private String getRealFilePath(Context c, Uri uri) {
        String result;
        Cursor cursor = c.getContentResolver().query(uri,
                new String[]{MediaStore.Images.ImageColumns.DATA},//
                null, null, null);
        if (cursor == null) result = uri.getPath();
        else {
            cursor.moveToFirst();
            int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
            result = cursor.getString(index);
            cursor.close();
        }
        return result;
    }

其實之前都是準備工作,接下來就是主要的核心內容了,就是用ZXing掃描一直路徑的圖片的功能了

就是parsePhoto方法   由於這個方法是耗時的  所以需要用AsyncTask  或者Rxjava  這裡用的是AsyncTask

具體程式碼如下:

    private void prasePhoto(final String path) {
        AsyncTask myTask = new AsyncTask<String, Integer, String>() {
            @Override
            protected String doInBackground(String... params) {
                // 解析二維碼/條碼
                return QRCodeDecoder.syncDecodeQRCode(path);
            }

            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                if (null == s) {
                    LogUtil.fussenLog().d("圖片獲取失敗,請重試");
                } else {
                    // 識別出圖片二維碼/條碼,內容為s
                    btn3.setText(s);
                    LogUtil.fussenLog().d(s);
                }
            }
        }.execute(path);
    }

裡面有一個類是自己寫的  QRCodeDecoder  裡面是最最重要的程式碼  如下:

public class QRCodeDecoder {
    public static final Map<DecodeHintType, Object> HINTS = new EnumMap<>(DecodeHintType.class);
    static {
        List<BarcodeFormat> allFormats = new ArrayList<>();
        allFormats.add(BarcodeFormat.AZTEC);
        allFormats.add(BarcodeFormat.CODABAR);
        allFormats.add(BarcodeFormat.CODE_39);
        allFormats.add(BarcodeFormat.CODE_93);
        allFormats.add(BarcodeFormat.CODE_128);
        allFormats.add(BarcodeFormat.DATA_MATRIX);
        allFormats.add(BarcodeFormat.EAN_8);
        allFormats.add(BarcodeFormat.EAN_13);
        allFormats.add(BarcodeFormat.ITF);
        allFormats.add(BarcodeFormat.MAXICODE);
        allFormats.add(BarcodeFormat.PDF_417);
        allFormats.add(BarcodeFormat.QR_CODE);
        allFormats.add(BarcodeFormat.RSS_14);
        allFormats.add(BarcodeFormat.RSS_EXPANDED);
        allFormats.add(BarcodeFormat.UPC_A);
        allFormats.add(BarcodeFormat.UPC_E);
        allFormats.add(BarcodeFormat.UPC_EAN_EXTENSION);
        HINTS.put(DecodeHintType.TRY_HARDER, BarcodeFormat.QR_CODE);
        HINTS.put(DecodeHintType.POSSIBLE_FORMATS, allFormats);
        HINTS.put(DecodeHintType.CHARACTER_SET, "utf-8");
    }
    private QRCodeDecoder() {
    }
    /**
     * 同步解析本地圖片二維碼。該方法是耗時操作,請在子執行緒中呼叫。
     *
     * @param picturePath 要解析的二維碼圖片本地路徑
     * @return 返回二維碼圖片裡的內容 或 null
     */
    public static String syncDecodeQRCode(String picturePath) {
        return syncDecodeQRCode(getDecodeAbleBitmap(picturePath));
    }
    /**
     * 同步解析bitmap二維碼。該方法是耗時操作,請在子執行緒中呼叫。
     *
     * @param bitmap 要解析的二維碼圖片
     * @return 返回二維碼圖片裡的內容 或 null
     */
    public static String syncDecodeQRCode(Bitmap bitmap) {
        Result result = null;
        RGBLuminanceSource source = null;
        try {
            int width = bitmap.getWidth();
            int height = bitmap.getHeight();
            int[] pixels = new int[width * height];
            bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
            source = new RGBLuminanceSource(width, height, pixels);
            result = new MultiFormatReader().decode(new BinaryBitmap(new HybridBinarizer(source)), HINTS);
            return result.getText();
        } catch (Exception e) {
            e.printStackTrace();
            if (source != null) {
                try {
                    result = new MultiFormatReader().decode(new BinaryBitmap(new GlobalHistogramBinarizer(source)), HINTS);
                    return result.getText();
                } catch (Throwable e2) {
                    e2.printStackTrace();
                }
            }
            return null;
        }
    }
    /**
     * 將本地圖片檔案轉換成可解碼二維碼的 Bitmap。為了避免圖片太大,這裡對圖片進行了壓縮。感謝 https://github.com/devilsen 提的 PR
     *
     * @param picturePath 本地圖片檔案路徑
     * @return
     */
    private static Bitmap getDecodeAbleBitmap(String picturePath) {
        try {
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(picturePath, options);
            int sampleSize = options.outHeight / 400;
            if (sampleSize <= 0) {
                sampleSize = 1;
            }
            options.inSampleSize = sampleSize;
            options.inJustDecodeBounds = false;
            return BitmapFactory.decodeFile(picturePath, options);
        } catch (Exception e) {
            return null;
        }
    }
}

以上就是本文最最重要的程式碼整理成工具類

裡面三個方法實際上就是  先把傳入的圖片的絕對地址轉換成Bitmap,然後把Bitmap用zxing裡面的方法讀取圖片的二維碼掃描結果然後在整合返回就可以了,實際上只調用最上面那個syncDecodeQRCode這個方法就可以了。

----------------------------------------------------------------------------------------------------------------

Ps,別忘了這個是耗時任務,所以有些要考慮的別忘考慮了。

相關推薦

Android 基於google Zxing實現手機中的進行掃描

我之前寫了一篇關於google Zxing掃描二維碼的文章,效果是仿微信的效果,有興趣的朋友可以去看看基於google Zxing實現二維碼、條形碼掃描,仿微信二維碼掃描效果,有時候我們有這樣子的需求,需要掃描手機中有二維碼的的圖片,所以今天實現的就是對手機中的二維碼圖片進行

當在微信進入小程序 並獲取到的參數 從而實現進入小程序

color 要求 decode 第一步 微信 函數 url 技術 bubuko 第一步: 登錄你的小程序賬號,找到設置 ,然後選擇開發設置 點擊添加後進去頁面:    填寫相應的一些二維碼規則,就是你生成這個掃碼的規則,還有根據項目情況填寫下面對應的要求 保存之後可以

在OpenJWeb平臺中實現主動(商家主動出示支付

上一篇介紹了被動掃碼的實現,本文介紹如何在OpenJWeb平臺中實現主動掃碼(商家生成支付二維碼),出示給使用者,使用者掃碼後通過微信付款。業務流程:(1)商家在POS機中錄好了商品和價格,然後呼叫微信的預下單介面(商家需要有自己的微信服務號和微信支付平臺,或者使用第三方平臺

微信支付寶支付代理加盟 采寶POS

微信支付代理 支付寶代理商 智能POS代理 現如今微信支付寶二維碼支付代理以及進入了支付潮流。如:銀幣、再到紙幣,演變到“錢”變得越來越輕薄。在現這個二維碼掃碼POS市場中,互聯網技術的支撐下,刷手機乘公交、刷支付寶買菜購物、繳水電費……日常生活中使用“現金”的場景,逐漸被手機各種支付方式取代,“無現金

Android本地生成圖片

最近在開發專案中,需要在APP中生成二維碼,我使用的Google Zxing的庫: 點選下載Zxing-core.jar 1、生成二維碼圖片 /** * 生成二維碼圖片

zxing掃描和識別圖片及其優化策略

轉自: 二維碼介紹 Android中用於二維碼相關的庫比較少,並且大多數已經不再維護(具體可見https://android-arsenal.com/tag/81)。其中最常用的是zxing和zbar。 zxing專案是谷歌推出的用來識別多種格式條形碼的開源專案,專案地址為

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

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

替換圖片

.cn dex pla spf replace inf .net cdr 圖片 http://img-replace-qr.wwwbuild.net/index.php?r=img-replace-qr/index&info=1&img=http

android 圖片識別和保存(一)

style file 長按 oba 成了 qrc 保存圖片 hybrid bin 最新業務開發二維碼識別的功能,這個功能,在很多應用上都有,比如微信長按圖片識別二維碼,如果圖片中存在可以識別的二維碼時,可以增加一個選項 識別二維碼。那麽如何去實現這個功能呢。這裏其實也

android 圖片識別和保存()

-a rac CA bar binary 占用 我們 new ogr 續上一篇,開發圖片二維碼識別功能後,我們對功能進行性能分析內存占用顯著提高了,不使用該功能內存占用大約是147M,使用這個功能多次以後,高達203M。 因此對功能進行研究,發現每次生成的圖片沒有即時

node 解析圖片內容

const {readFile, readFileSync} = require('fs'); const decodeImage = require('jimp').read; const qrcodeReader = require('qrcode-reader'); const path = re

iOS 掃描相簿圖片

級別:★★☆☆☆ 標籤:「iOS CIDetector」「CIQRCodeFeature」「識別相簿圖片」 作者: Xs·H 審校: QiShare團隊 接上篇 iOS 掃描二維碼/條形碼,本文補充介紹掃描相簿圖片上二維碼的實現方式。先看看QiQRCode中的示例效果:

python3+pyzbar+Image 進行圖片識別

1.前言   最近公司有個專案要寫個程式自動識別客戶提交照片裡的二維碼,一接到這個任務馬上就想到了用Python這個萬能的工具! 2.搜尋   首先在網上到處找了很多“靈感”,看看其他人都會用什麼包來完成這個功能。   實現方法大體可分為下面幾類: 1.用zbar 但zbar不支援python3,只好作罷,用

.net c#識別圖片 圖片處理(Img和BitMap)

1.場景 承接上篇,如何對攝像頭得到的圖片或者本地圖片進行二維碼識別   2.程式   程式使用類庫zxing.dll(用來識別二維碼),根據圖片識別二維碼方法是通用的 (1)識別二維碼並得到二維碼資訊的方法。(傳入引數為BitMap物件)

Java實現高可定製的生成

開篇廢話 不是第一次寫二維碼生成的程式碼,但是是第一次把它整理清晰並做成高可定製的。具體生成實現都是和網上的差不多用了com.swetake.util.Qrcode進行關鍵處理。但是這篇文章的不同之處在於不是為了簡單的實現,而是為了實現高可定製的功能。很多時候要用二維碼,但

Python實現識別多個條碼/

    這篇部落格實現的是“Python實現識別多個條碼/二維碼(一)”未完成的解碼任務。由於系統壞了,軟體重灌等一系列原因,所以拖到現在。。不好意思哈。     在上一篇中我們已經能把兩個條形碼找出並框起來了,接下來就是要解碼。先上程式碼吧。 from sys impo

HTML5 呼叫手機攝像頭掃描

最近有個專案需要使用H5呼叫手機攝像頭掃描二維碼斌且識別。(很奇葩的需求) 百度了下找到了這個api: 舊版:(目前只有UC瀏覽器支援,其他的手機瀏覽器一律沒有反應) https://developer.mozilla.org/zh-CN/docs/Web/API/Navi

vue js生成圖片-- qrcode外掛

在專案中安裝依賴 npm install --save qrcode 2.在專案中使用 <template> <div id='code'><

在ts+vue中實現前端批量下載打包

---恢復內容開始--- 一、外掛安裝   首先是外掛的安裝與引入,這裡我們用的是qrcode的這個外掛,直接使用npm install qrcodejs2安裝即可,但是這裡要注意,如果你用的是ts進行開發的話,這時候用傳統的import將qrcode引進來是不可取的,他會報錯:TS7016: Could

項目實例為添加logo

tns body except void switch coder rim mage ret using System; using System.Collections.Generic; using System.ComponentModel; using Sys