Android之自定义生成彩色二维码

先导个zxing.jar包

下面是xml布局

activity_main.xml

复制代码
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" 
    
    >

<EditText
    android:id="@+id/edittext"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_toLeftOf="@+id/button"
    android:hint="要生成的二维码" />

   <Button
       android:id="@+id/button"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignParentRight="true"
       android:layout_alignParentTop="true"
       android:text="生成" />

   <ImageView
       android:id="@+id/image"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerHorizontal="true"
       android:layout_centerVertical="true"
       />

</RelativeLayout>
复制代码

下面是MainActivity.java

图片自己找(头像,水印,背景)

复制代码
package com.bawei.create2imageview;


import com.google.zxing.WriterException;


import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.DisplayMetrics;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;

public class MainActivity extends Activity {

    private ImageView imageView;
    private EditText editText;
    private Button button;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //生成按钮
        button = (Button) findViewById(R.id.button);
        //输入框
        editText = (EditText) findViewById(R.id.edittext);
        //image
        imageView = (ImageView) findViewById(R.id.image);
        
        
        button.setOnClickListener(new OnClickListener() {
            
            public void onClick(View v) {
                // TODO Auto-generated method stub
                String trim = editText.getText().toString().trim();
                Bitmap bitmap;
                try {
                    //生成彩色二维码
                    //bitmap = BitmapUtil.makeQRImage(trim, 400,400);
                    //中间头像转成bitmap类型
                     bitmap = BitmapUtil.gainBitmap(getApplicationContext(), R.drawable.image1);
                     //加头像把头像放到二维码里 1.头像2.获取要转化成二维码的信息3.宽4.高
                     bitmap = BitmapUtil.makeQRImage(bitmap,trim,400,400);
                     //根据要转化成二维码的信息的多少定义生成二维码的大小
                    // bitmap = BitmapUtil.makeQRImage(trim,400,400);
                     //加水印 1.生成的二维码2.水印图片
                      bitmap = BitmapUtil.composeWatermark( bitmap,BitmapUtil.gainBitmap(getApplicationContext(), R.drawable.z));
                    //加背景 1.生成的二维码2.背景图片
                      bitmap =  BitmapUtil.addBackground(bitmap, BitmapUtil.gainBitmap(getApplicationContext(), R.drawable.image2));
                    if(bitmap != null){
                        //给image赋值
                        imageView.setImageBitmap(bitmap);
                    }
                    
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            
        });
    }
    

    
}
复制代码

BitmapUtil.java

复制代码
package com.bawei.create2imageview;

import java.util.Hashtable;
import java.util.Random;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
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;

public class BitmapUtil {

    /**
    * 根据指定内容生成自定义宽高的二维码图片
    *
    * param logoBm
    * logo图标
    * param content
    * 需要生成二维码的内容
    * param width
    * 二维码宽度
    * param height
    * 二维码高度
    * throws WriterException
    * 生成二维码异常
    */
    public static Bitmap makeQRImage(Bitmap logoBmp, String content,
    int QR_WIDTH, int QR_HEIGHT) throws WriterException {
    try {
    // 图像数据转换,使用了矩阵转换
    Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
    hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
    hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);// 容错率
    /*hints.put(EncodeHintType.MARGIN, 2); // default is 4
    hints.put(EncodeHintType.MAX_SIZE, 350);
    hints.put(EncodeHintType.MIN_SIZE, 100);*/
    BitMatrix bitMatrix = new QRCodeWriter().encode(content,
    BarcodeFormat.QR_CODE, QR_WIDTH, QR_HEIGHT, hints);
    int[] pixels = new int[QR_WIDTH * QR_HEIGHT];
    for (int y = 0; y < QR_HEIGHT; y++) {
    // 下面这里按照二维码的算法,逐个生成二维码的图片,//两个for循环是图片横列扫描的结果
    for (int x = 0; x < QR_WIDTH; x++) {
    if (bitMatrix.get(x, y)) {
    if (x < QR_WIDTH / 2 && y < QR_HEIGHT / 2) {
    pixels[y * QR_WIDTH + x] = 0xFF0094FF;// 蓝色
    Integer.toHexString(new Random().nextInt());
    } else if (x < QR_WIDTH / 2 && y > QR_HEIGHT / 2) {
    pixels[y * QR_WIDTH + x] = 0xFFFF0000;// 红色
    } else if (x > QR_WIDTH / 2 && y > QR_HEIGHT / 2) {
    pixels[y * QR_WIDTH + x] = 0xFF5ACF00;// 绿色
    } else {
    pixels[y * QR_WIDTH + x] = 0xFF000000;// 黑色
    }
    } else {
    pixels[y * QR_WIDTH + x] = 0xffffffff;// 白色
    }
    }
    }
    // ------------------添加图片部分------------------//
    Bitmap bitmap = Bitmap.createBitmap(QR_WIDTH, QR_HEIGHT,
    Bitmap.Config.ARGB_8888);
    // 设置像素点
    bitmap.setPixels(pixels, 0, QR_WIDTH, 0, 0, QR_WIDTH, QR_HEIGHT);
    // 获取图片宽高
    int logoWidth = logoBmp.getWidth();
    int logoHeight = logoBmp.getHeight();
    if (QR_WIDTH == 0 || QR_HEIGHT == 0) {
    return null;
    }
    if (logoWidth == 0 || logoHeight == 0) {
    return bitmap;
    }
    // 图片绘制在二维码中央,合成二维码图片
    // logo大小为二维码整体大小的1/5
    float scaleFactor = QR_WIDTH * 1.0f / 5 / logoWidth;
    try {
    Canvas canvas = new Canvas(bitmap);
    canvas.drawBitmap(bitmap, 0, 0, null);
    canvas.scale(scaleFactor, scaleFactor, QR_WIDTH / 2,
    QR_HEIGHT / 2);
    canvas.drawBitmap(logoBmp, (QR_WIDTH - logoWidth) / 2,
    (QR_HEIGHT - logoHeight) /2, null);
    canvas.save(Canvas.ALL_SAVE_FLAG);
    canvas.restore();
    return bitmap;
    } catch (Exception e) {
    bitmap = null;
    e.getStackTrace();
    }
    } catch (WriterException e) {
    e.printStackTrace();
    }
    return null;
    }
    /**
    * 获取十六进制的颜色代码.例如 "#6E36B4" , For HTML ,
    * @return String
    */
    public static String getRandColorCode(){
    String r,g,b;
    Random random = new Random();
    r = Integer.toHexString(random.nextInt(256)).toUpperCase();
    g = Integer.toHexString(random.nextInt(256)).toUpperCase();
    b = Integer.toHexString(random.nextInt(256)).toUpperCase();
    r = r.length()==1 ? "0" + r : r ;
    g = g.length()==1 ? "0" + g : g ;
    b = b.length()==1 ? "0" + b : b ;
    return r+g+b;
    }
    /**
    * 根据指定内容生成自定义宽高的二维码图片
    *
    * @param content
    * 需要生成二维码的内容
    * @param width
    * 二维码宽度
    * @param height
    * 二维码高度
    * @throws WriterException
    * 生成二维码异常
    */
    public static Bitmap makeQRImage(String content, int width, int height)
    throws WriterException {
    Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
    hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
    // 图像数据转换,使用了矩阵转换
    BitMatrix bitMatrix = new QRCodeWriter().encode(content,
    BarcodeFormat.QR_CODE, width, height, hints);
    int[] pixels = new int[width * height];
    // 按照二维码的算法,逐个生成二维码的图片,两个for循环是图片横列扫描的结果
    for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
    if (bitMatrix.get(x, y))
    pixels[y * width + x] = 0xff000000;
    else
    pixels[y * width + x] = 0xffffffff;
    }
    }
    // 生成二维码图片的格式,使用ARGB_8888
    Bitmap bitmap = Bitmap.createBitmap(width, height,
    Bitmap.Config.ARGB_8888);
    bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
    return bitmap;
    }
    /**
    * 从资源文件中获取图片转化成bitmap类型
    *
    * @param context
    * 上下文
    * @param drawableId
    * 资源文件id
    * @return
    */
    public static Bitmap gainBitmap(Context context, int drawableId) {
    Bitmap bmp = BitmapFactory.decodeResource(context.getResources(),
    drawableId);
    return bmp;
    }
    /**
    * 在图片右下角添加水印
    *
    * @param srcBMP
    * 原图
    * @param markBMP
    * 水印88图片
    * @return 合成水印后的图片
    */
    public static Bitmap composeWatermark(Bitmap srcBMP, Bitmap markBMP) {
    if (srcBMP == null) {
    return null;
    }
    // 创建一个新的和SRC长度宽度一样的位图
    Bitmap newb = Bitmap.createBitmap(srcBMP.getWidth(),
    srcBMP.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas cv = new Canvas(newb);
    // 在 0,0坐标开始画入原图
    cv.drawBitmap(srcBMP, 0, 0, null);
    // 在原图的右下角画入水印
    cv.drawBitmap(markBMP, srcBMP.getWidth() - markBMP.getWidth()*4/5,
    srcBMP.getHeight()*2/7 , null);
    // 保存
    cv.save(Canvas.ALL_SAVE_FLAG);
    // 存储
    cv.restore();
    return newb;
    }
    /**
    * 给二维码图片加背景
    *
    */
    public static Bitmap addBackground(Bitmap foreground,Bitmap background){
    int bgWidth = background.getWidth();
    int bgHeight = background.getHeight();
    int fgWidth = foreground.getWidth();
    int fgHeight = foreground.getHeight();
    Bitmap newmap = Bitmap
    .createBitmap(bgWidth, bgHeight, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(newmap);
    canvas.drawBitmap(background, 0, 0, null);
    canvas.drawBitmap(foreground, (bgWidth - fgWidth) / 2,
    (bgHeight - fgHeight) *3 / 5+70, null);
    canvas.save(Canvas.ALL_SAVE_FLAG);
    canvas.restore();
    return newmap;
    }
    }
复制代码

简单黑色二维码

mainactivity监听调用

//根据要转化成二维码的信息的多少定义生成二维码的大小
bitmap = BitmapUtil.makeQRImage(trim,400,400);

BitmapUtil调用的是

复制代码
/**
    * 根据指定内容生成自定义宽高的二维码图片
    *
    * @param content
    * 需要生成二维码的内容
    * @param width
    * 二维码宽度
    * @param height
    * 二维码高度
    * @throws WriterException
    * 生成二维码异常
    */
    public static Bitmap makeQRImage(String content, int width, int height)
    throws WriterException {
    Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
    hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
    // 图像数据转换,使用了矩阵转换
    BitMatrix bitMatrix = new QRCodeWriter().encode(content,
    BarcodeFormat.QR_CODE, width, height, hints);
    int[] pixels = new int[width * height];
    // 按照二维码的算法,逐个生成二维码的图片,两个for循环是图片横列扫描的结果
    for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
    if (bitMatrix.get(x, y))
    pixels[y * width + x] = 0xff000000;
    else
    pixels[y * width + x] = 0xffffffff;
    }
    }
    // 生成二维码图片的格式,使用ARGB_8888
    Bitmap bitmap = Bitmap.createBitmap(width, height,
    Bitmap.Config.ARGB_8888);
    bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
    return bitmap;
    }
复制代码

彩色二维码

把上面

if (bitMatrix.get(x, y))
pixels[y * width + x] = 0xff000000;
else
pixels[y * width + x] = 0xffffffff;

改为

复制代码
if (x < QR_WIDTH / 2 && y < QR_HEIGHT / 2) {
    pixels[y * QR_WIDTH + x] = 0xFF0094FF;// 蓝色
    Integer.toHexString(new Random().nextInt());
    } else if (x < QR_WIDTH / 2 && y > QR_HEIGHT / 2) {
    pixels[y * QR_WIDTH + x] = 0xFFFF0000;// 红色
    } else if (x > QR_WIDTH / 2 && y > QR_HEIGHT / 2) {
    pixels[y * QR_WIDTH + x] = 0xFF5ACF00;// 绿色
    } else {
    pixels[y * QR_WIDTH + x] = 0xFF000000;// 黑色
    }
    } else {
    pixels[y * QR_WIDTH + x] = 0xffffffff;// 白色
    }
复制代码

二维码加头像

mainactivity监听调用

//中间头像转成bitmap类型
bitmap = BitmapUtil.gainBitmap(getApplicationContext(), R.drawable.image1);
//加头像把头像放到二维码里 1.头像2.获取要转化成二维码的信息3.宽4.高
 bitmap = BitmapUtil.makeQRImage(bitmap,trim,400,400);

BitmapUtil调用的是

复制代码
/**
    * 根据指定内容生成自定义宽高的二维码图片
    *
    * param logoBm
    * logo图标
    * param content
    * 需要生成二维码的内容
    * param width
    * 二维码宽度
    * param height
    * 二维码高度
    * throws WriterException
    * 生成二维码异常
    */
    public static Bitmap makeQRImage(Bitmap logoBmp, String content,
    int QR_WIDTH, int QR_HEIGHT) throws WriterException {
    try {
    // 图像数据转换,使用了矩阵转换
    Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
    hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
    hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);// 容错率
    /*hints.put(EncodeHintType.MARGIN, 2); // default is 4
    hints.put(EncodeHintType.MAX_SIZE, 350);
    hints.put(EncodeHintType.MIN_SIZE, 100);*/
    BitMatrix bitMatrix = new QRCodeWriter().encode(content,
    BarcodeFormat.QR_CODE, QR_WIDTH, QR_HEIGHT, hints);
    int[] pixels = new int[QR_WIDTH * QR_HEIGHT];
    for (int y = 0; y < QR_HEIGHT; y++) {
    // 下面这里按照二维码的算法,逐个生成二维码的图片,//两个for循环是图片横列扫描的结果
    for (int x = 0; x < QR_WIDTH; x++) {
    if (bitMatrix.get(x, y)) {
    if (x < QR_WIDTH / 2 && y < QR_HEIGHT / 2) {
    pixels[y * QR_WIDTH + x] = 0xFF0094FF;// 蓝色
    Integer.toHexString(new Random().nextInt());
    } else if (x < QR_WIDTH / 2 && y > QR_HEIGHT / 2) {
    pixels[y * QR_WIDTH + x] = 0xFFFF0000;// 红色
    } else if (x > QR_WIDTH / 2 && y > QR_HEIGHT / 2) {
    pixels[y * QR_WIDTH + x] = 0xFF5ACF00;// 绿色
    } else {
    pixels[y * QR_WIDTH + x] = 0xFF000000;// 黑色
    }
    } else {
    pixels[y * QR_WIDTH + x] = 0xffffffff;// 白色
    }
    }
    }
    // ------------------添加图片部分------------------//
    Bitmap bitmap = Bitmap.createBitmap(QR_WIDTH, QR_HEIGHT,
    Bitmap.Config.ARGB_8888);
    // 设置像素点
    bitmap.setPixels(pixels, 0, QR_WIDTH, 0, 0, QR_WIDTH, QR_HEIGHT);
    // 获取图片宽高
    int logoWidth = logoBmp.getWidth();
    int logoHeight = logoBmp.getHeight();
    if (QR_WIDTH == 0 || QR_HEIGHT == 0) {
    return null;
    }
    if (logoWidth == 0 || logoHeight == 0) {
    return bitmap;
    }
    // 图片绘制在二维码中央,合成二维码图片
    // logo大小为二维码整体大小的1/5
    float scaleFactor = QR_WIDTH * 1.0f / 5 / logoWidth;
    try {
    Canvas canvas = new Canvas(bitmap);
    canvas.drawBitmap(bitmap, 0, 0, null);
    canvas.scale(scaleFactor, scaleFactor, QR_WIDTH / 2,
    QR_HEIGHT / 2);
    canvas.drawBitmap(logoBmp, (QR_WIDTH - logoWidth) / 2,
    (QR_HEIGHT - logoHeight) /2, null);
    canvas.save(Canvas.ALL_SAVE_FLAG);
    canvas.restore();
    return bitmap;
    } catch (Exception e) {
    bitmap = null;
    e.getStackTrace();
    }
    } catch (WriterException e) {
    e.printStackTrace();
    }
    return null;
    }
/**
    * 从资源文件中获取图片转化成bitmap类型
    *
    * @param context
    * 上下文
    * @param drawableId
    * 资源文件id
    * @return
    */
    public static Bitmap gainBitmap(Context context, int drawableId) {
    Bitmap bmp = BitmapFactory.decodeResource(context.getResources(),
    drawableId);
    return bmp;
    }
复制代码

二维码加水印

先生成二维码

然后mainactivity监听再调用

//加水印 1.生成的二维码2.水印图片
 bitmap = BitmapUtil.composeWatermark( bitmap ,BitmapUtil.gainBitmap(getApplicationContext(), R.drawable.z));

BitmapUtil调用的是

复制代码
/**
    * 在图片右下角添加水印
    *
    * @param srcBMP
    * 原图
    * @param markBMP
    * 水印88图片
    * @return 合成水印后的图片
    */
    public static Bitmap composeWatermark(Bitmap srcBMP, Bitmap markBMP) {
    if (srcBMP == null) {
    return null;
    }
    // 创建一个新的和SRC长度宽度一样的位图
    Bitmap newb = Bitmap.createBitmap(srcBMP.getWidth(),
    srcBMP.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas cv = new Canvas(newb);
    // 在 0,0坐标开始画入原图
    cv.drawBitmap(srcBMP, 0, 0, null);
    // 在原图的右下角画入水印
    cv.drawBitmap(markBMP, srcBMP.getWidth() - markBMP.getWidth()*4/5,
    srcBMP.getHeight()*2/7 , null);
    // 保存
    cv.save(Canvas.ALL_SAVE_FLAG);
    // 存储
    cv.restore();
    return newb;
    }
复制代码

二维码加背景

先生成二维码

然后mainactivity监听再调用

//加背景 1.生成的二维码2.背景图片
 bitmap =  BitmapUtil.addBackground(bitmap, BitmapUtil.gainBitmap(getApplicationContext(), R.drawable.image2));

BitmapUtil调用的是

复制代码
/**
    * 给二维码图片加背景
    *
    */
    public static Bitmap addBackground(Bitmap foreground,Bitmap background){
    int bgWidth = background.getWidth();
    int bgHeight = background.getHeight();
    int fgWidth = foreground.getWidth();
    int fgHeight = foreground.getHeight();
    Bitmap newmap = Bitmap
    .createBitmap(bgWidth, bgHeight, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(newmap);
    canvas.drawBitmap(background, 0, 0, null);
    canvas.drawBitmap(foreground, (bgWidth - fgWidth) / 2,
    (bgHeight - fgHeight) *3 / 5+70, null);
    canvas.save(Canvas.ALL_SAVE_FLAG);
    canvas.restore();
    return newmap;
    }
复制代码
原文地址:https://www.cnblogs.com/wbp0818/p/5421209.html