zoukankan      html  css  js  c++  java
  • 二维码生成方法

    二维码简单生成

    /**
    * 根据指定内容生成自定义宽高的二维码图片
    *
    * @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;
    }

    加logo小图标

    public class MainActivity extends Activity {
        protected int mScreenWidth;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            final EditText ed = (EditText) findViewById(R.id.ed);
            Button button = (Button) findViewById(R.id.shengcheng);
            final ImageView img = (ImageView) findViewById(R.id.img);
            button.setOnClickListener(new OnClickListener() {
    
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    String uri = ed.getText().toString();
    
                    Bitmap bitmap;
                    //调用方法
                    bitmap = BitmapUtil.create2DCoderBitmap(uri, 500, 500);
                    //设置logo从本地图资源中寻找
                    bitmap = addLogo(bitmap, BitmapFactory.decodeResource(
                            getApplicationContext().getResources(),
                            R.drawable.ic_launcher));
                    if (bitmap != null) {
                        img.setImageBitmap(bitmap);
                    }
    
                }
            });
    
        }
    
        /**
         * 在二维码中间添加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.ALL_SAVE_FLAG);
                canvas.restore();
            } catch (Exception e) {
                bitmap = null;
                e.getStackTrace();
            }
    
            return bitmap;
        }
    
    }


    彩色二维码

     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] = 0xFFFED545;// 黄色
                 } 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;// 白色
                 }
                 }
                 }


    二维码背景

    /**
    * 给二维码图片加背景
    *
    */
    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;
    }


    二维码水印

    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    /**
    * 在图片右下角添加水印
    *
    * @param srcBMP
    * 原图
    * @param markBMP
    * 水印图片
    * @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;
    }
     


    整体代码

    package com.ry.personalizedcode.uitls;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import com.google.zxing.BarcodeFormat;
    import com.google.zxing.EncodeHintType;
    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.Hashtable;
    import java.util.Random;
    /**
    * Created on 2016/2/24.
    * 生成二维码的工具类
    */
    public class MakeQRCodeUtil {
    /**
    * 根据指定内容生成自定义宽高的二维码图片
    *
    * 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] = 0xFFFED545;// 黄色
    } 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/2
    float scaleFactor = QR_WIDTH * 1.0f / 2 / 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;
    }
    /**
    * 从资源文件中获取图片
    *
    * @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
    * 水印图片
    * @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;
    }
    }
  • 相关阅读:
    Python 面向对象 —— super 的使用(Python 2.x vs Python 3.x)
    安全移除驱动器、弹出、卸载的差别及详细查看设备的运行前后的异同
    java中不常见的keyword:strictfp,transient
    textarea文本域宽度和高度(width、height)自己主动适应变化处理
    Android 输入框弹出样式
    .net下载优酷1080P视频
    Oracle Hints具体解释
    关于成本核算方法、步骤、成本分析的简单回复
    程序猿接私活经验总结,来自csdn论坛语录
    Android getResources的作用和须要注意点
  • 原文地址:https://www.cnblogs.com/3674-it/p/5408259.html
Copyright © 2011-2022 走看看