1、用的二維碼庫是:zxing_core_3.3.1.jar;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.util.Log;
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;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import java.util.HashMap;
import java.util.Map;
/**
* created by cy on 2020/7/8 0008.
*/
public class QRCodeUtils {
private static final String TAG = "QRCodeUtils";
/**
* 創建二維碼
*
* @param content content
* @param widthPix widthPix
* @param heightPix heightPix
* @param logoBm logoBm
* @return 二維碼
*/
public static Bitmap createQRCode(String content, int widthPix, int heightPix, Bitmap logoBm) {
try {
if (content == null || "".equals(content)) {
return null;
}
// 配置引數
Map<EncodeHintType, Object> hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
// 容錯級別
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
// 設定空白邊距的寬度
hints.put(EncodeHintType.MARGIN, 0);
// 影像資料轉換,使用了矩陣轉換
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;
} catch (WriterException e) {
e.printStackTrace();
}
return null;
}
/**
* 在二維碼中間添加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.restore();
} catch (Exception e) {
bitmap = null;
e.getStackTrace();
}
return bitmap;
}
/**
* 用字串生成二維碼
*/
public static Bitmap Create2DCode(String str, int width, int height) {
// 生成二維矩陣,編碼時指定大小,不要生成了圖片以后再進行縮放,這樣會模糊導致識別失敗
BitMatrix matrix;
Bitmap bitmap = null;
try {
Map<EncodeHintType, Object> hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
// 容錯級別
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
// 設定空白邊距的寬度
hints.put(EncodeHintType.MARGIN, 0);
matrix = new MultiFormatWriter().encode(str, BarcodeFormat.QR_CODE, width, height, hints);
// int realWidth = matrix.getWidth();
// int realHeight = matrix.getHeight();
Log.i(TAG, " matrix.getWidth() == " + matrix.getWidth());
Log.i(TAG, " matrix.getHeight() == " + matrix.getHeight());
// 二維矩陣轉為一維像素陣列,也就是一直橫著排了
int[] pixels = new int[width * height];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
if (matrix.get(x, y)) {
pixels[y * width + x] = 0xff000000;
}
}
}
Log.i(TAG, "width == " + width);
Log.i(TAG, "height == " + height);
bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
// 通過像素陣列生成bitmap,具體參考api
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
} catch (WriterException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bitmap;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/94783.html
標籤:其他
上一篇:超簡單的仿ios清除快取
下一篇:【江理工】小愛課程表適配了
