二维码生成秘籍

一、简单网页生成方式

  1. 打开网址:草料二维码
  2. 将所需的要生成的图片/文字/链接填入,一键生成,简单高效。

效果图

二、Android代码生成方式

本次使用的是大谷歌提供的zxing库,依赖地址:

compile ‘com.google.zxing:core:3.2.1’

传入文字(链接),宽高即可返回二维码bitmap,然后用于写入文件,还是显示imageview那就看你自己了。

/**
 * 生成二维码
 *
 * @param content 内容
 * @param width   宽
 * @param height  高
 * @return
 */
public Bitmap generateBitmap(String content, int width, int height) {
    QRCodeWriter qrCodeWriter = new QRCodeWriter();
    Map<EncodeHintType, String> hints = new HashMap<>();
    hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
    try {
        // 第一个参数表示生成二维码的文本内容,第二个参数表示编码格式,第三个参数表示生成的二维码的宽度,第四个参数表示生成的二维码的高度,第五个参数可选
        BitMatrix encode = qrCodeWriter.encode(content,
        BarcodeFormat.QR_CODE, width, height, hints);
        int[] pixels = new int[width * height];
        for (int i = 0; i < height; i++) {
            for (int j = 0; j < width; j++) {
                if (encode.get(j, i)) {
                    pixels[i * width + j] = 0x00000000;
                } else {
                    pixels[i * width + j] = 0xffffffff;
                }
            }
        }
        // 因为二维码只有黑白两种颜色,所以我们可以不用考虑透明度,直接使用RGB_565
        return Bitmap.createBitmap(pixels, 0, width, width, height, Bitmap.Config.RGB_565);
    } catch (WriterException e) {
        e.printStackTrace();
    }
    return null;
}

往往只生成二维码,用的并不多。其一,丑,黑乎乎,不美观;其二,不具有公司标识
然后就有了二维码+logo。

提供两种方式添加logo,一、直接传入二维码bitmap和logo Bitmap;二、二维码bitmap和文件资源文件。我们使用drawBitmap方法先将原本的二维码图片绘制出来,绘制完成之后,调用canvas的save方法,将当前的绘制状态保存下来,然后对画布进行缩放,缩小画布之后我们来绘制Logo,一帮情况下logo的宽高为二维码原图宽高的1/5(中心logo图片不宜过大,否则会影响到二维码的识别),所以我们先通过一个while循环获得缩放比例,然后调用canvas的scale方法对画布进行缩放,前两个参数表示宽高的缩放比例,大于1表示放大,小于1表示缩小,后两个参数表示缩放的中心点。缩放完成之后我们就可以绘制logo了,logo绘制完成之后,调用canvas的restore方法将画布恢复为原来的状态,最后将blankBitmap返回。

/**
 * 中间添加logo
 *
 * @param ctx      上下文
 * @param qrBitmap 二维码
 * @param logoId   logoId
 * @return
 */
public Bitmap addLogo(Bitmap qrBitmap, Context ctx, @DrawableRes int logoId) {
    return addLogo(qrBitmap, BitmapFactory.decodeResource(ctx.getResources(), logoId));
}


/**
 * 中间添加logo
 *
 * @param qrBitmap   二维码
 * @param logoBitmap logo
 * @return
 */
public Bitmap addLogo(Bitmap qrBitmap, Bitmap logoBitmap) {
    int qrBitmapWidth = qrBitmap.getWidth();
    int qrBitmapHeight = qrBitmap.getHeight();
    int logoBitmapWidth = logoBitmap.getWidth();
    int logoBitmapHeight = logoBitmap.getHeight();
    Bitmap blankBitmap = Bitmap.createBitmap(qrBitmapWidth, qrBitmapHeight, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(blankBitmap);
    canvas.drawBitmap(qrBitmap, 0, 0, null);
    canvas.save(Canvas.ALL_SAVE_FLAG);
    float scaleSize = 1.0f;
    while ((logoBitmapWidth / scaleSize) > (qrBitmapWidth / 5) || (logoBitmapHeight / scaleSize) > (qrBitmapHeight / 5)) {
        scaleSize *= 2;
    }
    float sx = 1.0f / scaleSize;
    canvas.scale(sx, sx, qrBitmapWidth / 2, qrBitmapHeight / 2);
    canvas.drawBitmap(logoBitmap, (qrBitmapWidth - logoBitmapWidth) / 2, (qrBitmapHeight - logoBitmapHeight) / 2, null);
    canvas.restore();
    return blankBitmap;
}

三、ios代码生成方式

ios7之后系统框架已经集成二维码的生成与读取, 这使开发变得方便很多, 并且会比第三方更加效率

1.因为系统二维码通过CIFilter的对象来完成, 所以导入这个类所在的框架:

 #import <CoreImage/CoreImage.h>
  1. 只需要实例化一个CIFilter的对象, 给该对象添加数据后生成二维码即可
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    // 1. 创建一个二维码滤镜实例(CIFilter)
    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    // 滤镜恢复默认设置
    [filter setDefaults];

    // 2. 给滤镜添加数据
    NSString *string = @"are you ok?"
    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
    // 使用KVC的方式给filter赋值
    [filter setValue:data forKeyPath:@"inputMessage"];

    // 3. 生成二维码
    CIImage *image = [filter outputImage];

    // 4. 显示二维码
    self.imageView.image = [UIImage imageWithCIImage:image];
}

添加logo

- (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size {

    CGRect extent = CGRectIntegral(image.extent);
    CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));

    // 1.创建bitmap;
    size_t width = CGRectGetWidth(extent) * scale;
    size_t height = CGRectGetHeight(extent) * scale;
    CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
    CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
    CIContext *context = [CIContext contextWithOptions:nil];
    CGImageRef bitmapImage = [context createCGImage:image fromRect:extent];
    CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
    CGContextScaleCTM(bitmapRef, scale, scale);
    CGContextDrawImage(bitmapRef, extent, bitmapImage);

    // 2.保存bitmap到图片
    CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
    CGContextRelease(bitmapRef);
    CGImageRelease(bitmapImage);
    return [UIImage imageWithCGImage:scaledImage];
}

更多内容精彩详见>>huiGer博客

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhihui_520/article/details/78354405
文章标签: 二维码 android
想对作者说点什么? 我来说一句

avfoundation开发秘籍

2018年01月11日 97.54MB 下载

JavaScript忍者秘籍(完整版)

2016年08月22日 88.41MB 下载

JavaScript忍者秘籍源码

2016年11月06日 367KB 下载

Unity 2D游戏开发秘籍

2015年11月18日 12.62MB 下载

《HTML5秘籍》PDF电子书

2014年05月18日 41.41MB 下载

没有更多推荐了,返回首页

不良信息举报

二维码生成秘籍

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭