摘要:
本篇是對筆者上一篇文章 Android進(jìn)階 - 二維碼生成 的一點(diǎn)補(bǔ)充。
效果圖:
工具類:
本篇不再重復(fù)說原理性的東西了。需要的朋友可以直接Copy使用仓坞。
注:使用該工具類需要引入ZXing庫或jar包(導(dǎo)入方法可查看上篇文章 Android進(jìn)階 - 二維碼生成 )。
/**
* @ClassName: QRCodeUtil
* @Description: 二維碼工具類
* @Author Wangnan
* @Date 2017/2/10
*/
public class QRCodeUtil {
/**
* 創(chuàng)建二維碼位圖
*
* @param content 字符串內(nèi)容
* @param size 位圖寬&高(單位:px)
* @return
*/
@Nullable
public static Bitmap createQRCodeBitmap(@Nullable String content, int size){
return createQRCodeBitmap(content, size, "UTF-8", "H", "4", Color.BLACK, Color.WHITE, null, null, 0F);
}
/**
* 創(chuàng)建二維碼位圖 (自定義黑、白色塊顏色)
*
* @param content 字符串內(nèi)容
* @param size 位圖寬&高(單位:px)
* @param color_black 黑色色塊的自定義顏色值
* @param color_white 白色色塊的自定義顏色值
* @return
*/
@Nullable
public static Bitmap createQRCodeBitmap(@Nullable String content, int size, @ColorInt int color_black, @ColorInt int color_white){
return createQRCodeBitmap(content, size, "UTF-8", "H", "4", color_black, color_white, null, null, 0F);
}
/**
* 創(chuàng)建二維碼位圖 (帶Logo小圖片)
*
* @param content 字符串內(nèi)容
* @param size 位圖寬&高(單位:px)
* @param logoBitmap logo圖片
* @param logoPercent logo小圖片在二維碼圖片中的占比大小,范圍[0F,1F]嗤形。超出范圍->默認(rèn)使用0.2F
* @return
*/
@Nullable
public static Bitmap createQRCodeBitmap(String content, int size, @Nullable Bitmap logoBitmap, float logoPercent){
return createQRCodeBitmap(content, size, "UTF-8", "H", "4", Color.BLACK, Color.WHITE, null, logoBitmap, logoPercent);
}
/**
* 創(chuàng)建二維碼位圖 (Bitmap顏色代替黑色) 注意!!!注意!!!注意!!! 選用的Bitmap圖片一定不能有白色色塊,否則會識別不出來!!!
*
* @param content 字符串內(nèi)容
* @param size 位圖寬&高(單位:px)
* @param targetBitmap 目標(biāo)圖片 (如果targetBitmap != null, 黑色色塊將會被該圖片像素色值替代)
* @return
*/
@Nullable
public static Bitmap createQRCodeBitmap(String content, int size, Bitmap targetBitmap){
return createQRCodeBitmap(content, size, "UTF-8", "H", "4", Color.BLACK, Color.WHITE, targetBitmap, null, 0F);
}
/**
* 創(chuàng)建二維碼位圖 (支持自定義配置和自定義樣式)
*
* @param content 字符串內(nèi)容
* @param size 位圖寬&高(單位:px)
* @param character_set 字符集/字符轉(zhuǎn)碼格式 (支持格式:{@link CharacterSetECI })。傳null時(shí),zxing源碼默認(rèn)使用 "ISO-8859-1"
* @param error_correction 容錯(cuò)級別 (支持級別:{@link ErrorCorrectionLevel })弧圆。傳null時(shí),zxing源碼默認(rèn)使用 "L"
* @param margin 空白邊距 (可修改,要求:整型且>=0), 傳null時(shí),zxing源碼默認(rèn)使用"4"赋兵。
* @param color_black 黑色色塊的自定義顏色值
* @param color_white 白色色塊的自定義顏色值
* @param targetBitmap 目標(biāo)圖片 (如果targetBitmap != null, 黑色色塊將會被該圖片像素色值替代)
* @param logoBitmap logo小圖片
* @param logoPercent logo小圖片在二維碼圖片中的占比大小,范圍[0F,1F],超出范圍->默認(rèn)使用0.2F笔咽。
* @return
*/
@Nullable
public static Bitmap createQRCodeBitmap(@Nullable String content, int size,
@Nullable String character_set, @Nullable String error_correction, @Nullable String margin,
@ColorInt int color_black, @ColorInt int color_white, @Nullable Bitmap targetBitmap,
@Nullable Bitmap logoBitmap, float logoPercent){
/** 1.參數(shù)合法性判斷 */
if(TextUtils.isEmpty(content)){ // 字符串內(nèi)容判空
return null;
}
if(size <= 0){ // 寬&高都需要>0
return null;
}
try {
/** 2.設(shè)置二維碼相關(guān)配置,生成BitMatrix(位矩陣)對象 */
Hashtable<EncodeHintType, String> hints = new Hashtable<>();
if(!TextUtils.isEmpty(character_set)) {
hints.put(EncodeHintType.CHARACTER_SET, character_set); // 字符轉(zhuǎn)碼格式設(shè)置
}
if(!TextUtils.isEmpty(error_correction)){
hints.put(EncodeHintType.ERROR_CORRECTION, error_correction); // 容錯(cuò)級別設(shè)置
}
if(!TextUtils.isEmpty(margin)){
hints.put(EncodeHintType.MARGIN, margin); // 空白邊距設(shè)置
}
BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, size, size, hints);
/** 3.根據(jù)BitMatrix(位矩陣)對象為數(shù)組元素賦顏色值 */
if(targetBitmap != null){
targetBitmap = Bitmap.createScaledBitmap(targetBitmap, size, size, false);
}
int[] pixels = new int[size * size];
for(int y = 0; y < size; y++){
for(int x = 0; x < size; x++){
if(bitMatrix.get(x, y)){ // 黑色色塊像素設(shè)置
if(targetBitmap != null) {
pixels[y * size + x] = targetBitmap.getPixel(x, y);
} else {
pixels[y * size + x] = color_black;
}
} else { // 白色色塊像素設(shè)置
pixels[y * size + x] = color_white;
}
}
}
/** 4.創(chuàng)建Bitmap對象,根據(jù)像素?cái)?shù)組設(shè)置Bitmap每個(gè)像素點(diǎn)的顏色值,之后返回Bitmap對象 */
Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, size, 0, 0, size, size);
/** 5.為二維碼添加logo小圖標(biāo) */
if(logoBitmap != null){
return addLogo(bitmap, logoBitmap, logoPercent);
}
return bitmap;
} catch (WriterException e) {
e.printStackTrace();
}
return null;
}
/**
* 向一張圖片中間添加logo小圖片(圖片合成)
*
* @param srcBitmap 原圖片
* @param logoBitmap logo圖片
* @param logoPercent 百分比 (用于調(diào)整logo圖片在原圖片中的顯示大小, 取值范圍[0,1], 傳值不合法時(shí)使用0.2F)
* 原圖片是二維碼時(shí),建議使用0.2F,百分比過大可能導(dǎo)致二維碼掃描失敗。
* @return
*/
@Nullable
private static Bitmap addLogo(@Nullable Bitmap srcBitmap, @Nullable Bitmap logoBitmap, float logoPercent){
/** 1. 參數(shù)合法性判斷 */
if(srcBitmap == null){
return null;
}
if(logoBitmap == null){
return srcBitmap;
}
if(logoPercent < 0F || logoPercent > 1F){
logoPercent = 0.2F;
}
/** 2. 獲取原圖片和Logo圖片各自的寬霹期、高值 */
int srcWidth = srcBitmap.getWidth();
int srcHeight = srcBitmap.getHeight();
int logoWidth = logoBitmap.getWidth();
int logoHeight = logoBitmap.getHeight();
/** 3. 計(jì)算畫布縮放的寬高比 */
float scaleWidth = srcWidth * logoPercent / logoWidth;
float scaleHeight = srcHeight * logoPercent / logoHeight;
/** 4. 使用Canvas繪制,合成圖片 */
Bitmap bitmap = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
canvas.drawBitmap(srcBitmap, 0, 0, null);
canvas.scale(scaleWidth, scaleHeight, srcWidth/2, srcHeight/2);
canvas.drawBitmap(logoBitmap, srcWidth/2 - logoWidth/2, srcHeight/2 - logoHeight/2, null);
return bitmap;
}
}