精华内容
下载资源
问答
  • 个性化二维码

    2016-09-26 09:45:30
    * 根据指定内容生成自定义宽高的二维码图片 * * @param content * 需要生成二维码的内容 * @param width * 二维码宽度 * @param height * 二维码高度 * @throws WriterException * 生成二维码异常 */ p
    http://www.jb51.net/article/80001.htm
    


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




    /**
    * 根据指定内容生成自定义宽高的二维码图片
    *
    * 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))
    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;
    }
    上段代码可以看出要给二维码图片中间加logo,但是图片不能占据整个二维码图片的很大一部分。
    然后还必须设置容错率:容错率有M,L,Q,H几个等级,容错率越高,二维码的有效像素点就越多。
    这里使用小写的utf-8编码,大写会出现]Q2\000026开头内容,为了好看点还设置了边距和大小。




    实现带logo的彩色二维码:
    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;
    }
    }




     //5.Android保存图片到系统图库
    public static void saveImageToGallery(Context context, Bitmap bmp) {
        // 首先保存图片
        File appDir = new File(Environment.getExternalStorageDirectory(), "Boohee");
        if (!appDir.exists()) {
            appDir.mkdir();
        }
        String fileName = System.currentTimeMillis() + ".jpg";
        File file = new File(appDir, fileName);
        try {
            FileOutputStream fos = new FileOutputStream(file);
            bmp.compress(CompressFormat.JPEG, 100, fos);
            fos.flush();
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
    }
        
        // 其次把文件插入到系统图库
        try {
            MediaStore.Images.Media.insertImage(context.getContentResolver(),
    file.getAbsolutePath(), fileName, null);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        // 最后通知图库更新
            context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" +Environment.getExternalStorageDirectory())));
    }
    展开全文
  • 这是WPF的应用程序,基于开源的Gma.QrCodeNet.Encoder项目实现的特定业务需求来开发的项目,实现个性化二维码的扩展,(生成模块化模块样式,预计二维码定位码眼样式的修改),集成了一些业务需求(可发布的gRPC远程...
  • 1 个性化的二维码是利用容错率来实现的 2 生活中的个性化二维码 3 二维码分为功能区和内容区,内容区可以缺失但是功能区不能缺失 4 用java代码实现个性化二维码 ...

    1 个性化的二维码是利用容错率来实现的


    2 生活中的个性化二维码

    3 二维码分为功能区和内容区,内容区可以缺失但是功能区不能缺失

    4 用java代码实现个性化二维码

    http://study.163.com/course/courseLearn.htm?courseId=999019#/learn/video?lessonId=1179225&courseId=999019


    
    展开全文
  • 个性化qrcode_create 个性化二维码生成,支持gif动画,python源码,附打好包的exe执行文件
  • swift 个性化二维码

    2020-06-05 12:16:29
    普通二维码 前景色,背景色 添加icon 定位角标(里,外) 直接放代码,大家可以根据需求自己封装 import UIKit let outerPositionPathOriginLength: CGFloat = 6.0; let outerPositionTileOriginWidth: ...

    前言:最近项目里面有一个需求,要改变定位角标的颜色
    大至如图:
    在这里插入图片描述

    于是整理了一下
    可以实现以下几个功能:
    • 普通二维码
    • 前景色,背景色
    • 添加icon
    • 定位角标(里,外)

    直接放代码,大家可以根据需求自己封装

    import UIKit
    
    let outerPositionPathOriginLength: CGFloat = 6.0;
    let outerPositionTileOriginWidth: CGFloat = 7.0;
    
    enum QRPosition {
        case TopLeft
        case TopRight
        case BottomLeft
        case Center
        case QuietZone
    }
    
    class QRCodeView: UIImageView {
    
        /// 前景色
        let foreColor = UIColor.black
        /// 背景色
        let backColor = UIColor.white
        
        /// logo 的线宽
        let borderWidth: CGFloat = 50
        /// logo线的颜色
        let borderColor = UIColor.white
        /// logo的宽高
        let logoSize: CGFloat = 80
        /// 定位角标里面的颜色
        let interAngle = UIColor.red
        /// 定位角标外面的颜色
        let outerAngle = UIColor.blue
        
        var outPutImage: CIImage = CIImage()
        
        init(QRCodeStr: String) {
            
            super.init(frame: CGRect(x: 50, y: 200, width: 300, height: 300))
            /// 获取二维码原图
            outPutImage = generateQRCodeFilter(text: QRCodeStr)
            
            /// 前景色 背景色 二维码
    //        self.image = generateColorCodeFilter(qrImage: outPutImage)
            
            ///  高清二维码
            let highImage = setupHighDefinitionUIImage(outPutImage, size: self.frame.size.width)
            
            /// 添加头像
            let headImage = addPicture(qrCodeImage: highImage, image: UIImage(named: "head") ?? UIImage())
            
            /// 修改定位角标
            let angleImage = changeOrientationAngle(image: headImage)
            
            self.image = angleImage
            
            
        }
        
        required init?(coder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
        
        /// 添加logo
        func addPicture(qrCodeImage:UIImage, image: UIImage) -> UIImage {
            //给头像加一个白色圆边(如果没有这个需求直接忽略)
            let image = circleImageWithImage(image, borderWidth: borderWidth, borderColor: borderColor)
            //合成图片
            let newImage = syntheticImage(qrCodeImage, iconImage: image, width: logoSize, height: logoSize)
            
            return newImage
        }
        
        /// 定位角标
        func changeOrientationAngle(image: UIImage) -> UIImage {
            UIGraphicsBeginImageContextWithOptions(image.size, false, UIScreen.main.scale);
            image.draw(in: CGRect(x: 0, y: 0, width: self.frame.size.width, height: self.frame.size.width))
    
            let cifiter = CIFilter(name: "CICrop")
            cifiter?.setValue(CIVector(x: 0, y: 0, z: 10, w: 10), forKey: "inputRectangle")
    
            let coreImage = CIImage(color: CIColor(cgColor: interAngle.cgColor))
            cifiter?.setValue(coreImage, forKey: "inputImage")
    
            if let filteredImage = cifiter?.outputImage {
                /// 里面的框框
                let colorImage = UIImage.init(ciImage: filteredImage)
                self.changePositionInnerColor(image: colorImage, position: .TopLeft)
                self.changePositionInnerColor(image: colorImage, position: .TopRight)
                self.changePositionInnerColor(image: colorImage, position: .BottomLeft)
                /// 外面的框框
                self.changeOuterPositionColor(color: outerAngle, position: .TopLeft)
                self.changeOuterPositionColor(color: outerAngle, position: .TopRight)
                self.changeOuterPositionColor(color: outerAngle, position: .BottomLeft)
            }
    
            guard let newPic = UIGraphicsGetImageFromCurrentImageContext() else { return UIImage() }
            UIGraphicsEndImageContext()
    
            return newPic
        }
        
        
        /// 基本二维码
        func generateQRCodeFilter(text: String) -> CIImage {
            
            ///  创建二维码滤镜
            let qrFilter = CIFilter(name: "CIQRCodeGenerator")
            qrFilter?.setDefaults()
            qrFilter?.setValue(text.data(using: String.Encoding.utf8), forKey: "inputMessage")
            qrFilter?.setValue("H", forKey: "inputCorrectionLevel")
            guard let outputImage = qrFilter?.outputImage else { return CIImage() }
            
            return outputImage
        }
        
        /// 创建颜色滤镜
        func generateColorCodeFilter(qrImage: CIImage) -> UIImage {
            ///  创建颜色滤镜
            let colorFilter = CIFilter(name: "CIFalseColor")
            colorFilter?.setDefaults()
            colorFilter?.setValue(qrImage, forKey: "inputImage")
            let foreColor = CIColor(cgColor: self.foreColor.cgColor)
            let backColor = CIColor(cgColor: self.backColor.cgColor)
            colorFilter?.setValue(foreColor, forKey: "inputColor0")
            colorFilter?.setValue(backColor, forKey: "inputColor1")
    
            guard let outputImage = colorFilter?.outputImage else { return UIImage() }
    
            // 返回二维码image
            let codeImage = UIImage(ciImage: (outputImage.transformed(by: CGAffineTransform(scaleX: 10, y: 10))))
    
            return codeImage
        }
        
        /// 获取Version
        func fetchVersion() -> CGFloat {
            return ((outPutImage.extent.size.width - 21)/4.0 + 1)
        }
        
        /// 设置那个定位角标内框
        func changePositionInnerColor(image: UIImage, position: QRPosition) {
            let rect = self.innerPositionRectWidth(width: self.frame.size.width, version: self.fetchVersion(), postion: position)
            image.draw(in: rect)
        }
        
        /// 设置那个定位角标外框
        func changeOuterPositionColor(color: UIColor, position: QRPosition) {
            let path = self.outerPositionPathWidth(width: self.frame.size.width, version: self.fetchVersion(), position: position)
            color.setStroke()
            path.stroke()
        }
        
        //image: 二维码 iconImage:头像图片 width: 头像的宽 height: 头像的宽
        func syntheticImage(_ image: UIImage, iconImage:UIImage, width: CGFloat, height: CGFloat) -> UIImage{
            //开启图片上下文
            UIGraphicsBeginImageContext(image.size)
            //绘制背景图片
            image.draw(in: CGRect(origin: CGPoint.zero, size: image.size))
            
            let x = (image.size.width - width) * 0.5
            let y = (image.size.height - height) * 0.5
            iconImage.draw(in: CGRect(x: x, y: y, width: width, height: height))
            //取出绘制好的图片
            let newImage = UIGraphicsGetImageFromCurrentImageContext()
            //关闭上下文
            UIGraphicsEndImageContext()
            //返回合成好的图片
            if let newImage = newImage {
                return newImage
            }
            return UIImage()
        }
    
        //MARK: - 生成高清的UIImage
        func setupHighDefinitionUIImage(_ image: CIImage, size: CGFloat) -> UIImage {
            let integral: CGRect = image.extent.integral
            let proportion: CGFloat = min(size/integral.width, size/integral.height)
            
            let width = integral.width * proportion
            let height = integral.height * proportion
            let colorSpace: CGColorSpace = CGColorSpaceCreateDeviceGray()
            let bitmapRef = CGContext(data: nil, width: Int(width), height: Int(height), bitsPerComponent: 8, bytesPerRow: 0, space: colorSpace, bitmapInfo: 0)!
            
            let context = CIContext(options: nil)
            let bitmapImage: CGImage = context.createCGImage(image, from: integral)!
            
            bitmapRef.interpolationQuality = CGInterpolationQuality.none
            bitmapRef.scaleBy(x: proportion, y: proportion);
            bitmapRef.draw(bitmapImage, in: integral);
            let image: CGImage = bitmapRef.makeImage()!
            return UIImage(cgImage: image)
        }
    
        
        /// logo 生成边框
        func circleImageWithImage(_ sourceImage: UIImage, borderWidth: CGFloat, borderColor: UIColor) -> UIImage {
            let imageWidth = sourceImage.size.width + 2 * borderWidth
            let imageHeight = sourceImage.size.height + 2 * borderWidth
            
            UIGraphicsBeginImageContextWithOptions(CGSize(width: imageWidth, height: imageHeight), false, 0.0)
            UIGraphicsGetCurrentContext()
            
            let radius = (sourceImage.size.width < sourceImage.size.height ? sourceImage.size.width:sourceImage.size.height) * 0.5
            let bezierPath = UIBezierPath(arcCenter: CGPoint(x: imageWidth * 0.5, y: imageHeight * 0.5), radius: radius, startAngle: 0, endAngle: .pi * 2, clockwise: true)
            bezierPath.lineWidth = borderWidth
            borderColor.setStroke()
            bezierPath.stroke()
            bezierPath.addClip()
            sourceImage.draw(in: CGRect(x: borderWidth, y: borderWidth, width: sourceImage.size.width, height: sourceImage.size.height))
            
            let image = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return image!
        }
    
        /// 定位角标内边框
        func innerPositionRectWidth(width: CGFloat, version: CGFloat, postion: QRPosition) -> CGRect {
            let leftMargin = width * 3 / ((version - 1) * 4 + 21)
            let tileWidth = leftMargin
            let centerImageWith = width * 7 / ((version - 1) * 4 + 21)
            
            var rect = CGRect(x: leftMargin + 1.5, y: leftMargin + 1.5, width: leftMargin - 3, height: leftMargin - 3)
            rect = rect.integral;
            rect = rect.insetBy(dx: -1, dy: -1);
            
            var offset: CGFloat = 0.0
            
            switch postion {
            case .TopLeft:
                break
            case .TopRight:
                offset = width - tileWidth - leftMargin*2;
                rect = rect.offsetBy(dx: offset, dy: 0);
            case .BottomLeft:
                offset = width - tileWidth - leftMargin * 2;
                rect = rect.offsetBy(dx: 0, dy: offset);
            case .Center:
                rect = CGRect(x: CGPoint.zero.x, y: CGPoint.zero.y, width: centerImageWith, height: centerImageWith)
                offset = width/2 - centerImageWith/2;
                rect = rect.offsetBy(dx: offset, dy: offset);
            default:
                rect = .zero;
            }
            return rect
        }
        
    
        /// 定位角标外边框
        func outerPositionPathWidth(width: CGFloat, version: CGFloat, position: QRPosition) -> UIBezierPath {
            let zonePathWidth = width/((version - 1) * 4 + 21)
            let positionFrameWidth = zonePathWidth * outerPositionPathOriginLength
            let topLeftPoint = CGPoint(x: zonePathWidth * 1.5, y: zonePathWidth * 1.5)
            
            var rect = CGRect(x: topLeftPoint.x - 0.2, y: topLeftPoint.y - 0.2, width: positionFrameWidth, height: positionFrameWidth)
            
            rect = rect.integral;
            rect = rect.insetBy(dx: 1, dy: 1);
            
            var path: UIBezierPath
            var offset: CGFloat = 0.0
            switch position {
            case .TopLeft:
                path = UIBezierPath(rect: rect)
                path.lineWidth = zonePathWidth + 1.5
                path.lineCapStyle = .square
            case .TopRight:
                offset = width - positionFrameWidth - topLeftPoint.x * 2
                rect = rect.offsetBy(dx: offset, dy: 0)
                path = UIBezierPath(rect: rect)
                path.lineWidth = zonePathWidth + 1.5
                path.lineCapStyle = .square
            case .BottomLeft:
                offset = width - positionFrameWidth - topLeftPoint.x * 2
                rect = rect.offsetBy(dx: 0, dy: offset)
                path = UIBezierPath(rect: rect)
                path.lineWidth = zonePathWidth + 1.5
                path.lineCapStyle = .square
            case .QuietZone:
                rect = CGRect(x: zonePathWidth * 0.5, y: zonePathWidth * 0.5, width: width - zonePathWidth, height: width - zonePathWidth)
                path = UIBezierPath(rect: rect)
                path.lineWidth = zonePathWidth + UIScreen.main.scale;
                path.lineCapStyle = .square;
            default:
                path = UIBezierPath()
            }
            return path
        }
    }
    

    调用:

    import UIKit
    
    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
            let codeView = QRCodeView(QRCodeStr: "https://www.baidu.com/index.php?tn=monline_3_dg")
            self.view.addSubview(codeView)  
        }
    }
    

    如果想知道原理,可以看看二维码的生成规则, 写的很详细。
    这个是swift版的,如果你用OC版可以在github上下载 MKQRCode,这个就是参照他写的,在此非常的感谢他😊

    展开全文
  • 个性化二维码生成

    2019-07-07 21:08:00
    一、先生成一个简单的二维码 from MyQR import myqr myqr.run( words='http://www.baidu.com', save_name='pic01.png' ) 效果图: 二、下面来将以张图片插入二维码中 from MyQR import ...

    安装MyQR模块

    一、先生成一个简单的二维码

    from MyQR import myqr
    myqr.run(
        words='http://www.baidu.com',
        save_name='pic01.png'
    )

    效果图:

     

    二、下面来将以张图片插入二维码中

     

    from MyQR import myqr
    myqr.run(
        words='http://www.baidu.com',
        picture='E:\\untitled\\二维码\\Sources\\亲亲.png',
        save_name='pic02.png'
    )

    生成效果:

     

     

    加点颜色:

    from MyQR import myqr
    myqr.run(
        words='http://www.baidu.com',
        picture='E:\\untitled\\二维码\\Sources\\亲亲.png',
        colorized=True,
        save_name='pic02.png'
    )

     

    最后来一张动态的

    注意。动态图片生成后面保持的格式不能是png了,一般是gif

    效果:

     

    转载于:https://www.cnblogs.com/tuzaizi/p/11147848.html

    展开全文
  • python模块之MyQR——制作个性化二维码

    万次阅读 多人点赞 2019-11-28 12:34:31
    MyQR模块可以生成个性化二维码图片。 安装MyQR 如果没有安装,那么就需要安装:pip install MyQR。 MyQR安装成功判断 模块使用 模块参数介绍 myqr.run()函数里面的参数如下: 参数 含义 详细 ...
  • 二维码这个小玩意大家都不陌生吧,百度曰:二维码(Two-dimensional code),又称二维条码,它是用特定的几何图形按一定规律在平面(二维方向)上分布的黑白相间的图形,是所有信息数据的一把钥匙。在现代商业活动中...
  • 二维码火了,纯黑色已经满足不了人们对个性化的需求,XDOC从9.1.6开始使用图形方式绘制二维码。可以通过设置填充色、渐变、填充图、边线等,产生个性化二维码。下面展示一下效果:   用XDOC更大的好处是可以...
  • java生成个性化二维码

    千次阅读 2019-06-28 12:09:39
    基础代码: ... 代码修改处 ...为什么解析不出来呢,是因为生成二维码图片太花了,而我又懒的找干净的背景图片,就凑合着生成二维码 。可是识别不出来的二维码,再好看又有什么用呢[抠鼻] 二维码
  • 今天给大家带来一个简单的Python应用实验:生成个性二维码。 实验内容: 通过调用MyQR接口来实现生成个人所需二维码,并可以设置二维码的大小、是否在现有图片的基础上生成、是否生成动态二维码。主要面向Python3...
  • 是否生成黑白二维码或彩色二维码图片 colorized=True, # version类型为整型,设置二维码图片的边长 version=10) 生成的二维码图片如下: 步骤很简单,生成的二维码会保存在你运行此Python 程序的目录下。picture要...
  • Python3 MyQR 生成个性化二维码

    千次阅读 2019-01-02 14:42:14
    MyQR 库:可生成普通二维码、带图片的艺术二维码(黑白与彩色)、动态二维码(黑白与彩色) from MyQR import myqr # 导入 MyQR 库 version, level, qr_name = myqr.run( words = 'You are my today and all ...
  • 普通二维码 彩色二维码 动态二维码 首先,需要pip安装第三方库: pip install myqr 基本语法: myqr 二维码内容 设置参数: -n:二维码的名称 -d:二维码的路径 -v:二维码的大小,1~40,默认值取决于二维码内容 -l:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,031
精华内容 4,412
关键字:

个性化二维码