zoukankan      html  css  js  c++  java
  • 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;
        }
  • 相关阅读:
    数据库SQL实战- 获取所有非manager员工当前的薪水情况,给出dept_no、emp_no以及salary ,当前表示to_date='9999-01-01'
    数据库SQL实战- 查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_no以及其对应的薪水涨幅growth,并按照growth进行升序
    数据库SQL实战- 查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不准使用order by
    springboot 整合redis 以及redis的简单使用
    SQL语句按in排序
    编写高质量的代码
    linux 后渗透测试
    工具包学习与收集
    python 学习实例(cmdMD链接)
    python 学习之FAQ:find 与 find_all 使用
  • 原文地址:https://www.cnblogs.com/1426837364qqcom/p/5407647.html
Copyright © 2011-2022 走看看