Android:使用ZXing生成二維碼(支援新增Logo圖案)
ZXing是谷歌的一個開源庫,可以用來生成二維碼、掃描二維碼。本文所介紹的是第一部分。
首先上效果圖:
1.生成二維碼的工具類
2.在Activity中的使用:/** * 二維碼生成工具類 */ public class QRCodeUtil { /** * 生成二維碼Bitmap * * @param content 內容 * @param widthPix 圖片寬度 * @param heightPix 圖片高度 * @param logoBm 二維碼中心的Logo圖示(可以為null) * @param filePath 用於儲存二維碼圖片的檔案路徑 * @return 生成二維碼及儲存檔案是否成功 */ public static boolean createQRImage(String content, int widthPix, int heightPix, Bitmap logoBm, String filePath) { try { if (content == null || "".equals(content)) { return false; } //配置引數 Map<EncodeHintType, Object> hints = new HashMap<>(); hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); //容錯級別 hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); //設定空白邊距的寬度 // hints.put(EncodeHintType.MARGIN, 2); //default is 4 // 影象資料轉換,使用了矩陣轉換 BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, widthPix, heightPix, hints); int[] pixels = new int[widthPix * heightPix]; // 下面這裡按照二維碼的演算法,逐個生成二維碼的圖片, // 兩個for迴圈是圖片橫列掃描的結果 for (int y = 0; y < heightPix; y++) { for (int x = 0; x < widthPix; x++) { if (bitMatrix.get(x, y)) { pixels[y * widthPix + x] = 0xff000000; } else { pixels[y * widthPix + x] = 0xffffffff; } } } // 生成二維碼圖片的格式,使用ARGB_8888 Bitmap bitmap = Bitmap.createBitmap(widthPix, heightPix, Bitmap.Config.ARGB_8888); bitmap.setPixels(pixels, 0, widthPix, 0, 0, widthPix, heightPix); if (logoBm != null) { bitmap = addLogo(bitmap, logoBm); } //必須使用compress方法將bitmap儲存到檔案中再進行讀取。直接返回的bitmap是沒有任何壓縮的,記憶體消耗巨大! return bitmap != null && bitmap.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(filePath)); } catch (WriterException | IOException e) { e.printStackTrace(); } return false; } /** * 在二維碼中間新增Logo圖案 */ private static Bitmap addLogo(Bitmap src, Bitmap logo) { if (src == null) { return null; } if (logo == null) { return src; } //獲取圖片的寬高 int srcWidth = src.getWidth(); int srcHeight = src.getHeight(); int logoWidth = logo.getWidth(); int logoHeight = logo.getHeight(); if (srcWidth == 0 || srcHeight == 0) { return null; } if (logoWidth == 0 || logoHeight == 0) { return src; } //logo大小為二維碼整體大小的1/5 float scaleFactor = srcWidth * 1.0f / 5 / logoWidth; Bitmap bitmap = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888); try { Canvas canvas = new Canvas(bitmap); canvas.drawBitmap(src, 0, 0, null); canvas.scale(scaleFactor, scaleFactor, srcWidth / 2, srcHeight / 2); canvas.drawBitmap(logo, (srcWidth - logoWidth) / 2, (srcHeight - logoHeight) / 2, null); canvas.save(Canvas.ALL_SAVE_FLAG); canvas.restore(); } catch (Exception e) { bitmap = null; e.getStackTrace(); } return bitmap; } }
/** * 二維碼生成 */ public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //內容 final EditText contentET = (EditText) findViewById(R.id.create_qr_content); //顯示二維碼圖片 final ImageView imageView = (ImageView) findViewById(R.id.create_qr_iv); //是否新增Logo final CheckBox addLogoCB = (CheckBox) findViewById(R.id.create_qr_addLogo); Button createQrBtn = (Button) findViewById(R.id.create_qr_btn); createQrBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final String filePath = getFileRoot(MainActivity.this) + File.separator + "qr_" + System.currentTimeMillis() + ".jpg"; //二維碼圖片較大時,生成圖片、儲存檔案的時間可能較長,因此放在新執行緒中 new Thread(new Runnable() { @Override public void run() { boolean success = QRCodeUtil.createQRImage(contentET.getText().toString().trim(), 800, 800, addLogoCB.isChecked() ? BitmapFactory.decodeResource(getResources(), R.mipmap.qr_logo) : null, filePath); if (success) { runOnUiThread(new Runnable() { @Override public void run() { imageView.setImageBitmap(BitmapFactory.decodeFile(filePath)); } }); } } }).start(); } }); } //檔案儲存根目錄 private String getFileRoot(Context context) { if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { File external = context.getExternalFilesDir(null); if (external != null) { return external.getAbsolutePath(); } } return context.getFilesDir().getAbsolutePath(); } }
3.本專案中圖片檔案儲存在
context.getExternalFilesDir(null)
目錄之下的。按照官方的api文件,從KitKat開始(Android 4.4),儲存檔案到這個目錄下將不需要SD卡讀寫許可權。但是經過測驗表明,在紅米Note和魅族MX3上(系統均為android 4.4.4),的確不需要許可權;但是在本人的華為P6上(Android 4.4.2),必須宣告許可權才能成功的儲存檔案,即必須在manifest中新增如下內容:
因此,個人猜測,所謂的不需要許可權是從 Android 4.4.4開始的。<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
相關推薦
Android:使用ZXing生成二維碼(支援新增Logo圖案)
ZXing是谷歌的一個開源庫,可以用來生成二維碼、掃描二維碼。本文所介紹的是第一部分。 首先上效果圖: 1.生成二維碼的工具類 /** * 二維碼生成工具類 */ public class QRCodeUtil { /** * 生成二維碼Bit
Android:使用ZXing生成二維碼(支持加入Logo圖案)
over rmi api note sta size argb_8888 reat for循環 ZXing是谷歌的一個開源庫。能夠用來生成二維碼、掃描二維碼。本文所介紹的是第一部分。 首先上效果圖: ZXing相關各種文件官方下載地址:https://g
Java 中使用 google.zxing 快捷生成二維碼(附工具類原始碼)
移動網際網路時代,基於手機端的各種活動掃碼和收付款碼層出不窮;那我們如何在Java中生成自己想要的二維碼呢?下面就來講講在Java開發中使用 google.zxing 生成二維碼。 一般情況下,Java生成二維碼的方式有三種,一種是基於 google.zxing ,是google公司出的;一種
java 使用zxing生成二維碼(帶logo和文字說明的)
jar包maven地址 <dependency> <groupId>com.google.zxing</groupId> <artifactId>core<
java使用Qrcode生成二維碼(內嵌logo)
1、前言 整理一個使用qrcode.jar生成二維碼的測試方法,以備後面學習使用。 2、使用準備 Qrcode.jar 3、demo /* 生成二維碼 */ @RequestMapping(value="/creatQ
生成二維碼(可改變尺寸顏色)
因為要公司業務中有個要做個用手機掃描書本上二維碼的功能,我要做一個給出版社提供一個可以生成不同尺寸和顏色的二維碼功能 先上效果圖 先選擇顏色前端頁面程式碼我就不展示了 生成效果圖 引入jar <dependency> <
Android平臺生成二維碼(by google.zxing)
查了大部分的資料,發現android平臺下生成二維碼的例子都是使用谷歌的zxing類,因此仿照某一個帖子編寫了一個demo進行測試,仿照的帖子: https://blog.csdn.net/myname_kk/article/details/77649477 例子中主要用到了BitMatri
Android用Zxing掃二維碼/生成二維碼功能
新年已過,一切恢復真正常,新的一年給自己幾句指引: 光努力還不行,方向很重要。 總是想著最壞的結果,就會讓人失去改變的勇氣。 你當然有權利選擇自己的人生--但只有在你真正強大後,逆行的阻力才會降到最小。 never say never. 下面開始記錄二維碼使用過程
Android平臺利用Zxing生成二維碼與解析圖片中的二維碼
轉載請註明http://blog.csdn.net/houkai6/article/details/47102733 1. 生成二維碼 public final class EncodingHandler { private static final int BLACK
Android 使用Zxing實現二維碼的生成,掃描
在專案中要使用到二維碼的相關內容,百度(原諒我還在用)之後得知一半都是使用Google的開源庫 Zxing,但是網上多半的使用教程都是比較早的,這裡給出我總結的一些基礎程式碼和使用規則: 首先要一定要先去官網看看: 1. 如何匯入 如果是使用andro
zxing生成二維碼
fault awt .com void auth args dom systems import <dependency> <groupId>com.google.zxing</groupId> <artifact
zxing生成二維碼設置邊框顏色
嘗試 edi osi 循環 span static right 開始 top 真是研究了很久很久,滿滿的淚啊 zxing生成二維碼,默認是可以增加空白邊框的,但是並沒有說設置邊框顏色的屬性。 其中增加空白邊框的屬性的一句話是: Map hints = new Ha
WPF調用zxing生成二維碼
大小 pac xaml returns pri 進行 writer 創建 idt 1.登錄http://zxingnet.codeplex.com/,下載對應.net版本的zxing庫 2.引入zxing.dll 3.新建界面控件 using System; using
java學習-zxing生成二維碼矩陣的簡單例子
map obj 基於 The output 圖片 .get imageio sts 這個例子需要使用google的開源項目zxing的核心jar包 core-3.2.0.jar 可以百度搜索下載jar文件 也可使用maven添加依賴 <de
Android 把url生成二維碼並貼到給定的底圖上
主要是用到了com.google.zxing jar包生成二維碼的功能,這個jar包需要自己接下載 直接上程式碼 public static Bitmap CreateBinaryCodeImageByUrl(String url,Bitmap bottomImg,int dra
zxing生成二維碼以流式傳到頁面
@RequestMapping(“/makeQrCode”) public void madeQrCode(HttpServletResponse res,String content,Integer width,Integer height) throws IOException{
生成二維碼(java後端)
需要引入2個jar包: <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <versi
Zxing 生成二維碼
首先新增依賴 implementation ‘cn.bingoogolapple:bga-qrcode-zxing:1.2.5’ 新增許可權 佈局 MainActivity package com.lll.zxingsc; import android.Manifes
使用zxing生成二維碼工具類
public class QRCodeUtils { /** * 建立二維碼(有白邊) * * @param string * @return */ public static Bitmap c
SpringBoot 使用 zxing 生成二維碼 返回Base64編碼
前置知識 生成二維碼目前的技術目前有兩大類:QRCode 和 Zxing QRCode 是日本原生的二維碼生成技術,目前只有 0.5Beta 版且不能通過maven等構件工具引入 Zxing 是google 對二維碼生成技術的包裝,提供給Android系統用,不過也可以