注释已经写得很详细了,就不再单独说明了,直接把工具类拷贝到项目里就可以使用,别忘了导入zxing.jar
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Matrix;
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.decoder.ErrorCorrectionLevel;
import java.util.Hashtable;
/**
* 二维码生成相关
* Created by yangle on 2015/10/22.
*/
public class CodeUtils {
// 宽度值,影响中间图片大小
private static final int IMAGE_HALFWIDTH = 40;
/**
* 生成中间带图片的二维码
*
* @param context 上下文
* @param content 二维码内容
* @param logo 二维码中间的图片
* @return 生成的二维码图片
* @throws WriterException 生成二维码异常
*/
public static Bitmap createCode(Context context, String content, Bitmap logo) throws WriterException {
Matrix m = new Matrix();
float sx = (float) 2 * IMAGE_HALFWIDTH / logo.getWidth();
float sy = (float) 2 * IMAGE_HALFWIDTH / logo.getHeight();
// 设置缩放信息
m.setScale(sx, sy);
// 将logo图片按martix设置的信息缩放
logo = Bitmap.createBitmap(logo, 0, 0, logo.getWidth(),
logo.getHeight(), m, false);
MultiFormatWriter writer = new MultiFormatWriter();
Hashtable hst = new Hashtable();
// 设置字符编码
hst.put(EncodeHintType.CHARACTER_SET, "UTF-8");
// 设置二维码容错率
hst.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
// 生成二维码矩阵信息
BitMatrix matrix = writer.encode(content, BarcodeFormat.QR_CODE,
DensityUtils.dp2px(context, 300),
DensityUtils.dp2px(context, 300), hst);
// 矩阵高度
int width = matrix.getWidth();
// 矩阵宽度
int height = matrix.getHeight();
int halfW = width / 2;
int halfH = height / 2;
// 定义数组长度为矩阵高度*矩阵宽度,用于记录矩阵中像素信息
int[] pixels = new int[width * height];
// 从行开始迭代矩阵
for (int y = 0; y < height; y++) {
// 迭代列
for (int x = 0; x < width; x++) {
// 该位置用于存放图片信息
if (x > halfW - IMAGE_HALFWIDTH && x < halfW + IMAGE_HALFWIDTH
&& y > halfH - IMAGE_HALFWIDTH
&& y < halfH + IMAGE_HALFWIDTH) {
// 记录图片每个像素信息
pixels[y * width + x] = logo.getPixel(x - halfW
+ IMAGE_HALFWIDTH, y - halfH + IMAGE_HALFWIDTH);
} else {
// 如果有黑块点,记录信息
if (matrix.get(x, y)) {
// 记录黑块信息
pixels[y * width + x] = 0xff000000;
} else {
pixels[y * width + x] = Color.WHITE;
}
}
}
}
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
// 通过像素数组生成bitmap
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
return bitmap;
}
/**
* 生成用户的二维码
*
* @param context 上下文
* @param content 二维码内容
* @return 生成的二维码图片
* @throws WriterException 生成二维码异常
*/
public static Bitmap createCode(Context context, String content) throws WriterException {
//生成二维矩阵,编码时指定大小,不要生成了图片以后再进行缩放,这样会模糊导致识别失败
BitMatrix matrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE,
DensityUtils.dp2px(context, 250),
DensityUtils.dp2px(context, 250));
int width = matrix.getWidth();
int height = 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;
} else {
pixels[y * width + x] = Color.WHITE;
}
}
}
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
//通过像素数组生成bitmap
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
return bitmap;
}
}
生成带图片的二维码调用方法
//设置二维码
try {
// 调用方法createCode生成二维码
Bitmap logo = BitmapFactory.decodeResource(super.getResources(), R.drawable.portrait_default_square);
Bitmap bm = CodeUtils.createCode("二维码测试", logo);
// 将二维码在界面中显示
iv_code.setImageBitmap(bm);
} catch (WriterException e) {
e.printStackTrace();
}
附上DensityUtils类
import android.content.Context;
/**
* px与dp互相转换
* Created by yangle on 2016/4/12.
*/
public class DensityUtils {
public static int dp2px(Context context, float dp) {
//获取设备密度
float density = context.getResources().getDisplayMetrics().density;
//4.3, 4.9, 加0.5是为了四舍五入
int px = (int) (dp * density + 0.5f);
return px;
}
public static float px2dp(Context context, int px) {
//获取设备密度
float density = context.getResources().getDisplayMetrics().density;
float dp = px / density;
return dp;
}
}