精华内容
下载资源
问答
  • 个性二维码生成(android开发)
    2020-04-22 14:20:24

    @二维码生成

    个性二维码

    第一次接触二维码开发,对二维码刚有所了解的时候,就得到要做个性二维码 的需求。看着网络上的个性二维码,陷入了沉思。 心里千万遍问自己,这到底是什么实现原理呢?后面找来找去,各种资料都翻上来了:在朋友的帮助下,找到一篇有用的文章,并在此文章的引导下,完成了个性二维码的开发。感谢作者。即下发的原理参考链接

    原理参考

    链接: link.

    图片参考:

    在这里插入图片描述

    代码片

    上面原理参考有了大体实现原理的代码了,但是还漏了三四个方法,花了两天白了头给补上了。。。
    (File 对应后台传过来的图片,我这边给转成file文件使用)

    
     /**
         绘制个性二维码
         */
        public Bitmap createAreBitmap(Context context, String str, int width, boolean isDeleteWhiteGap,
                                      ErrorCorrectionLevel level,List<ArtQrcodeBean> artQrcodeBeans)
                throws WriterException, NullPointerException {
            Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
            if (null != level) {
                hints.put(EncodeHintType.ERROR_CORRECTION, level);// 指定纠错等级
            }
            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");//指定编码格式
            if (TextUtils.isEmpty(str)) {
                return null;
            }
            if (matrix == null){
                matrix = new QRCodeWriter().encode(str, BarcodeFormat.QR_CODE,
                        0, 0, hints);
    
                if (isDeleteWhiteGap) {
                    matrix = deleteWhite(matrix);//删除白边
                }
            }
            if (formatBitMatrix(matrix)){
    
                this.artQrcodeBeans = artQrcodeBeans;
    
                int codeWidth = width/codeNumPerLine;
                int remainder = width%codeNumPerLine;
                int matrixWidth = width;
                if (remainder > 0){//调整初始图片的宽度,凑整,让每个码元点占用整数个像素点
                    codeWidth++;
                    matrixWidth = codeWidth*codeNumPerLine;
                }
                judgeRule();
                getAllRects();
                searchfRect();
                Bitmap bitmap = Bitmap.createBitmap(matrixWidth,matrixWidth, Bitmap.Config.ARGB_8888);
                Canvas canvas = new Canvas(bitmap);
    
                Paint paint = new Paint();
                paint.setColor(Color.WHITE);
                canvas.drawRect(0,0,bitmap.getWidth(),bitmap.getHeight(),paint);
                codeUnit = codeWidth;
                drawPicture(canvas,paint,codeWidth);
    
                Bitmap bitmap1 = Bitmap.createBitmap(bitmap.getWidth()-codeWidth,bitmap.getHeight()-codeWidth, Bitmap.Config.ARGB_8888);
                Canvas canvas1 = new Canvas(bitmap1);
                canvas1.drawBitmap(bitmap,0,0,null);
                return  bitmap1;
            }
            return  null;
        }
    
    
        /**
         * 格式化BitMatrix,找出其中所有的码元点
         * @param bitMatrix
         * @return
         */
        private boolean formatBitMatrix(BitMatrix bitMatrix){
            boolean success = false;
            int matrixLength = bitMatrix.getWidth();
            int matrixHeight = bitMatrix.getHeight();
            if (matrixLength == matrixHeight && matrixLength>(LOCATOR_WIDTH+1)*2){
                success = true;
                codeNumPerLine = matrixLength;
    
                leftLocator.set(0,0,LOCATOR_WIDTH,LOCATOR_WIDTH);
                rightLocator.set(matrixLength-LOCATOR_WIDTH-codeUnit,0,matrixLength,LOCATOR_WIDTH);
                bottomLocator.set(0,matrixLength-LOCATOR_WIDTH-codeUnit,LOCATOR_WIDTH,matrixLength);
                //遍历,得出所有的码元
                for (int x = 0; x < matrixLength; x++) {
                    StringBuilder sb = new StringBuilder("列"+x);
                    StringBuilder sb_p = new StringBuilder("point");
                    //先列遍历,在行遍历
                    for (int y = 0; y < matrixLength; y++) {
                        //查看此element是否为有信息的码元点(二维码黑色部分)
                        boolean info = bitMatrix.get(x,y);
                        MyPoint point = new MyPoint(x,y);
                        if (info){
                            String pointStr = "["+y+","+x+"]";
                            if (!isElementInRect(leftLocator,point) && !isElementInRect(rightLocator,point) &&
                                    !isElementInRect(bottomLocator,point) ){
    //以列优先的顺序存放,故需要把下标的行列反过来,便于操作
                                int columnRow = y+x*matrixLength;
                                //存储码元在可用码元矩阵中的列行坐标
                                this.codeElements.put(columnRow,point);
                                codeElementList.add(point);
                                sb.append(pointStr);
                            }else {
                                sb_p.append(pointStr);
                            }
                        }
                    }
                    sb_p.append(" in locator");
                }
            }
            return success;
        }
    
    /**
     * 遍历形状集合Shape,查找出所有的矩形框,将其中的码元标记为已发现,并添加到outElements集合里
     * @param shape
     */
    private void adjustRect(RectShape shape) {
        for (int i = 0; i < shape.getAllPoints().size(); i++) {
            for (int j = 0; j < codeElements.size(); j++) {
                if ( shape.getAllPoints().get(i).equals(codeElements.valueAt(j))){
                    outElements.put(codeElements.keyAt(j),codeElements.valueAt(j));
                }
            }
        }
    }
    
    private boolean containt(MyPoint point){
        if (point == null ||point.isAdd())
            return false;
        return codeElementList.contains(point) ;
    }
    
    private void drawPicture( Canvas canvas, Paint paint ,int codeWidth) {
        //先画三个定位符
        Bitmap locatorBitmap = BitmapFactory.decodeFile(codeEyeFile.getAbsolutePath());
        Bitmap locatorIcon = Bitmap.createScaledBitmap(locatorBitmap,LOCATOR_WIDTH*codeWidth,LOCATOR_WIDTH*codeWidth,true);
        canvas.drawBitmap(locatorIcon, leftLocator.left*codeWidth,leftLocator.top*codeWidth,paint);
        canvas.drawBitmap(locatorIcon,rightLocator.left*codeWidth,rightLocator.top*codeWidth,paint);
        canvas.drawBitmap(locatorIcon,bottomLocator.left*codeWidth,bottomLocator.top*codeWidth,paint);
    
        Random rand = new Random();
        //再画找到的所有矩形框
        for (int index1 = 0; index1 < allRects.size(); index1++) {
            int shapeId = allRects.keyAt(index1);//key为此集合中相同的shapeId
            SparseArray<MyPoint> rects = allRects.valueAt(index1);
            RectShape shape = SHAPES.get(shapeId);
            if (shape.getFileList()!= null && shape.getFileList().size() != 0){
                int size2 = rects != null?rects.size():0;
                List<Bitmap>   bitmaps1 = new ArrayList<>();
                for (int i = 0; i < shape.getFileList().size(); i++) {
                    if (shape.getFileList().get(i)  != null){
                        Bitmap bmp = BitmapFactory.decodeFile(shape.getFileList().get(i) .getAbsolutePath());
                        Bitmap shapeIcon = Bitmap.createScaledBitmap(bmp,(int) shape.getWidth()*codeUnit,(int) shape.getHeight()*codeUnit,true);
                        bitmaps1.add(shapeIcon);
                    }
                }
                int num = 0;
                for (int index2 = 0; index2 < size2; index2++) {
                    MyPoint point = rects.valueAt(index2);
                    if (point != null){
    
                        if (bitmaps1.size() != 1){
                            num =  rand.nextInt(bitmaps1.size());
                        }
    
                        Bitmap bitmap = bitmaps1.get(num);
                        canvas.drawBitmap(bitmap,point.x * codeUnit,point.y*codeUnit,paint);
                    }
                }
                for (int i = 0; i < bitmaps1.size(); i++) {
                    bitmaps1.get(i).recycle();
                }
            }
        }
    
        if ( fileType11List.size() != 0){
            //再画剩下的单个码元
            List<Bitmap> codeBitmaps = new ArrayList<>();
            for (int i = 0; i < fileType11List.size(); i++) {
                Bitmap singleBitmap = BitmapFactory.decodeFile(fileType11List.get(i).getAbsolutePath());
                Bitmap codeBmp = Bitmap.createScaledBitmap(singleBitmap,codeUnit,codeUnit,true);
                codeBitmaps.add(codeBmp);
            }
            int size = codeElements.size();
            int num = 0;
            for (int singleIndex = 0; singleIndex < size; singleIndex++) {
                MyPoint point = codeElements.valueAt(singleIndex);
    
                if (point != null){
                    if (codeBitmaps.size() != 1){
                        num =  rand.nextInt(codeBitmaps.size());
                    }
                    Bitmap bitmap = codeBitmaps.get(num);
                    canvas.drawBitmap(bitmap,point.x * codeUnit,point.y*codeUnit,paint);
                }
            }
            for (int i = 0; i < codeBitmaps.size(); i++) {
                codeBitmaps.get(i).recycle();
            }
            System.gc();
        }
    }
    
    /*除白边*/
    private BitMatrix deleteWhite(BitMatrix matrix) {
        int[] rec = matrix.getEnclosingRectangle();
        int resWidth = rec[2] + 1;//右
        int resHeight = rec[3] + 1;//下
    
        BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);
        resMatrix.clear();
        for (int i = 0; i < resWidth; i++) {
            for (int j = 0; j < resHeight; j++) {
                if (matrix.get(i + rec[0], j + rec[1]))
                    resMatrix.set(i, j);
            }
        }
        return resMatrix;
    }
    
    
    
    ```javascript
    public class MyPoint extends Point {
        private boolean isAdd = false;
        public MyPoint() {
        }
    
        public MyPoint(int x, int y) {
            super(x, y);
        }
    
        public MyPoint(@NonNull Point src) {
            super(src);
        }
    
        public boolean isAdd() {
            return isAdd;
        }
    
        public void setAdd(boolean add) {
            isAdd = add;
        }
    }
    
    

    不明白可以私我
    源码下载

    bean类等
    public class ArtQrcodeBean implements Parcelable {
    private Bitmap codeEyeBitmap;
    private String img_url;
    private int rule;
    private Bitmap bitmap;

    protected ArtQrcodeBean(Parcel in) {
        codeEyeBitmap = in.readParcelable(Bitmap.class.getClassLoader());
        img_url = in.readString();
        rule = in.readInt();
        bitmap = in.readParcelable(Bitmap.class.getClassLoader());
    }
    
    public static final Creator<ArtQrcodeBean> CREATOR = new Creator<ArtQrcodeBean>() {
        @Override
        public ArtQrcodeBean createFromParcel(Parcel in) {
            return new ArtQrcodeBean(in);
        }
    
        @Override
        public ArtQrcodeBean[] newArray(int size) {
            return new ArtQrcodeBean[size];
        }
    };
    
    public Bitmap getBitmap() {
        return bitmap;
    }
    
    public void setBitmap(Bitmap bitmap) {
        this.bitmap = bitmap;
    }
    
    
    public String getImg_url() {
        return img_url;
    }
    
    public void setImg_url(String img_url) {
        this.img_url = img_url;
    }
    
    public int getRule() {
        return rule;
    }
    
    public void setRule(int rule) {
        this.rule = rule;
    }
    
    public Bitmap getCodeEyeBitmap() {
        return codeEyeBitmap;
    }
    
    public void setCodeEyeBitmap(Bitmap codeEyeBitmap) {
        this.codeEyeBitmap = codeEyeBitmap;
    }
    
    @Override
    public int describeContents() {
        return 0;
    }
    
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeParcelable(codeEyeBitmap, flags);
        dest.writeString(img_url);
        dest.writeInt(rule);
        dest.writeParcelable(bitmap, flags);
    }
    

    }

    public class RectShape extends Shape {
    private RectF mRect = new RectF();

    public RectShape() {}
    
    @Override
    public void draw(Canvas canvas, Paint paint) {
        canvas.drawRect(mRect, paint);
    }
    
    @Override
    public void getOutline(Outline outline) {
        final RectF rect = rect();
        outline.setRect((int) Math.ceil(rect.left), (int) Math.ceil(rect.top),
                (int) Math.floor(rect.right), (int) Math.floor(rect.bottom));
    }
    
    /**
     * chf
     * TYPE_33:指代 x轴3个点,y轴3个点的矩阵
     */
    private int resID;
    

    // private File file;
    private List bitmapList;
    private int type;
    public static final int TYPE_32 = 32;
    public static final int TYPE_23 = 23;
    public static final int TYPE_22 = 22;
    public static final int TYPE_12 = 12;
    public static final int TYPE_13 = 13;
    public static final int TYPE_21 = 21;
    public static final int TYPE_31 = 31;
    public static final int TYPE_41 = 41;
    public static final int TYPE_14 = 14;
    private List allPoints = new ArrayList<>();

    // public File getFile() {
    // return file;
    // }
    //
    // public void setFile(File file) {
    // this.file = file;
    // }

    public List<Bitmap> getBitmapList() {
        return bitmapList;
    }
    
    public void setBitmapList(List<Bitmap> bitmapList) {
        this.bitmapList = bitmapList;
    }
    
    public int getResID() {
        return resID;
    }
    
    public void setResID(int resID) {
        this.resID = resID;
    }
    
    public int getType() {
        return type;
    }
    
    public void setType(int type) {
        this.type = type;
    }
    
    public List<MyPoint> getAllPoints() {
        return allPoints;
    }
    
    public void setAllPoints(List<MyPoint> allPoints) {
        this.allPoints = allPoints;
    }
    
    @Override
    protected void onResize(float width, float height) {
        mRect.set(0, 0, width, height);
    }
    
    /**
     * Returns the RectF that defines this rectangle's bounds.
     */
    protected final RectF rect() {
        return mRect;
    }
    
    @Override
    public RectShape clone() throws CloneNotSupportedException {
        final RectShape shape = (RectShape) super.clone();
        shape.mRect = new RectF(mRect);
        return shape;
    }
    
    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        if (!super.equals(o)) {
            return false;
        }
        RectShape rectShape = (RectShape) o;
        return Objects.equals(mRect, rectShape.mRect);
    }
    
    @Override
    public int hashCode() {
        return Objects.hash(super.hashCode(), mRect);
    }
    

    }

    更多相关内容
  • 如何用python语言编写,个性二维码制作工具。支持各种格式图片(gif等)。分两期,第一期先将软件分享给大家,第二期代码层面分享讲解
  • python实现个性二维码

    2018-08-06 11:00:20
    通过python可以简单的实现网址转二维码,简单又有趣,还可以自定义自己喜欢的背景图片,支持gif,png等背景图片的加载,快来试试吧,制作独一无二的个性二维码,拿起手机扫一扫,别是一番滋味,很爽,嘿嘿
  • 个性二维码制作工具软件是一款二维码个性制作软件,可根据个性化需要,调整二维码的颜色。 个性二维码制作工具软件的功能与特点: 1.根据输入的内容自动检测编码格式,自动生成二维码 2.根据内容的长度自动调整...
  • 主要介绍了基于Python生成个性二维码过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 二维码的用处有很多,本篇文章主要介绍了微信公众平台开发教程(六)获取个性二维码的实例,有兴趣的可以了解一下。
  • 有人通过制作个性二维码致富,今天社长凯先生就要对不住啦(不是抢饭碗,是打破饭碗~)公开这种赚钱方法的所有具体操作方法~手把手教你(嘴对嘴超超超...详细教学~) 图中各种个性二维码的制作,其实方法非常简单...

    20200516个性二维码、二维码美化.png

    前段时间,在刷朋友圈的时候竟发现一条致富发家新道路!有人通过制作个性二维码致富,今天社长凯先生就要对不住啦(不是抢饭碗,是打破饭碗~)公开这种赚钱方法的所有具体操作方法~手把手教你(嘴对嘴超超超...详细教学~)

    图中各种个性二维码的制作,其实方法非常简单!真的分分钟学会~有的时候感觉自己在赚钱方面,还是太佛系啦!我不得不佩服微商,这点我还是应该多向广大微商朋友们学习学习!多多指教~

    重点这次安卓苹果用户都有,毕竟还是要“雨露均沾”~

    方法其实很简单,只需要简单几步就可以完成制作,重要的是制作工具的选择,有了工具,聪明的你不用教就可以学会,不会的话,那你就不...会往下看啊~(sorry,有些激动~)

    2.gif

    一、安卓篇

    安卓用户可以使用Qart App自助快速制作,个人感觉没什么操作难度~那么怎样下载Qart呢?不要着急,这个我们后面会说到!

    Qart是开源免费的,除了制作合成个性二维码外,还可以扫描或识别二维码~

    4_副本.jpg

    如果你自己有能力想要更多功能的话,可以去编译出来一个版本~在GitHub上可以找到项目地址。

    5_副本.png

     

    Qart 有普通、图片、图标、嵌入四种模式,普通模式与我们平常看到的很多二维码一样,就是一个二维码,并没有过多的修饰;图片模式是我们今天内容的重点,就是将二维码和图片进行合成;图标模式是在二维码中间加入图片、logo,和我们的微信名片二维码样式类似;嵌入模式就是以海报图片部分为背景生成二维码,有点一点马赛克滴味道~

     

    6_副本.jpg

     

    图片模式支持黑白、彩色以及GIF动图,黑白和彩色区别不大,彩色更加漂亮,动图就是背景支持GIF动图!

    我们这里以彩色为例,其他的方法步骤一样类似!

     

    7_副本.jpg

     

    既然是“嘴对嘴”教学,那么就要一步一步来、详细详细再详细...接下来我们就说说具体制作过程~

    1、首先我们需要准备好二维码(网址、文本内容...)可以先不选择模式,然后点击右上角的倒三角▼选择文本,在刚弹出的那一栏我们可以直接输入网址或者文本内容,也可以点击右侧的二维码图标,选择扫描或读取准备好的二维码,最后点击确定自动返回主界面!

    扫描和读取还是有些区别,扫描是调用手机摄像头扫码获取,而读取则是通过选择相册中保存好的二维码图片获取。

     

    8_副本.jpg

     

    2、接下来,我们就是将二维码和背景图片进行合成。

    首先点击右上角的图片图标,选择相册中准备好的背景图片,选好背景图片以后,再点击右上角的箭头图标按照提示操作就行!

     

    9_副本.jpg

     

    接下来,根据提示选择合成二维码是黑白还是彩色的,如果选择彩色的话,还需要选择颜色,选取的颜色是需要注意,建议选择与背景图片颜色对比强烈的颜色,否则会识别失败!!

     

    10_副本.jpg

     

    以上步骤设置完成,就会马上生成。

    我们可以点击右上角▼按钮进行保存,也可以进行撤销、换色以及更改模式!

     

    11_副本.jpg

     

    安卓手机生成合成个性图片二维码的教程就到这里~接下来我们来说说苹果手机怎样制作个性图片二维码!

     

    二、苹果篇

    苹果手机,我们可以使用EFQRcode和二维码秀秀这两款App来制作,大家可以在App Store搜索下载。两款App都完全免费、无内购、无广告!

     

    12_副本.jpg

     

    (一)首先,我们先说说二维码秀秀,这个App界面比较简单(陋),但是不影响我们使用。

    打开以后,界面非常简单,只有“识别图中二维码”、“生成制作二维码”以及扫描二维码图标三个菜单,简单吧!

     

    13_副本.png

     

    1、第一步仍然是准备好二维码(网址或者文本内容均可),我们可以点击“识别图中二维码”识别手机相册中的二维码图片,也可以点击右上角的扫描按钮调用手机摄像头扫码,如果是网址或者文本内容可以点击“生成制作二维码”以后再输入。

    14_副本.png

     

    2、我们只需要将上图中的相关选项设置完成,包括二维码信息,背景图片,图片中心的icon图标...设置完成以后保存二维码就可以啦!这个没有什么特别要说明的!

     

    15_副本.jpg

     

    (二)说完二维码秀秀,我们再说一下另一款App【EFQRcode】

    与二维码秀秀相比,这款App不太友好,全是英文界面,所以对于英语不好的人稍显麻烦一些。

    “EFQRcode”也是开源的,项目地址同样也可以在GitHub上找到~

     

    16_副本.png

     

    “EFQRcode”主界面同样非常简单。第一行是识别;第二行是生成。识别的时候只能从手机相册中选择二维码,不能调用摄像头扫码。

     

    17_副本.png

     

    我们点击“Generator”进入详细参数设置界面,由于界面都是英文,所以我这里简单给大家对比翻译一下~

     

    18_副本.jpg

     

    图片中的各个参数并不需要都了解,很多参数采用默认选项即可,不需要更改,我这里介绍几个比较常用的参数设置。

    icon和watermark都可以选择App内置的图片,也可以点击“Select from system album”从手机相册中选择图片。

     

    19_副本.jpg

     

    关于“watermarkMode”,“scaleToFill”按比例填满;“scaleAspectFit”适应屏幕比例;“scaleAspectFill”按屏幕比例填满,其他的依次为中心、顶部、底部、左、右、左上、右上、左下、右下。有什么区别自行研究~

     

    IMG_1606_副本.png

     

    关于“point Shape”的形状有方形、圆形与钻石三种选择~

     

    26_副本.jpg

     

    设置完成以后,我们点击底部的“Create”生成即可!

     

    21_副本.png

     

    生成好的个性二维码图片,我们可以点击“Save”保存到相册,点击“Back”返回修改参数设置!

     

    22_副本.png

     

    注意:个性二维码在微信中大多数情况下都可以识别,但是不保证在其他App中也可以识别~请在使用环境下测试好!

    关于怎样制作个性二维码的教程到此结束!感兴趣的小伙伴赶快去试试吧~哪里有问题的话可以在下方给我留言!

    展开全文
  • 这个软件是从网络中搜集而来的,免费提供给大家!希望对你们有用处!
  • 公众号后台回复“图书“,了解更多号主新书内容作者:Python进阶者来源:Python爬虫与数据挖掘/前言/在现代社会中,我们出行坐公交经常会看到二维码,支付宝微信收款也会有二维码...

    公众号后台回复“图书“,了解更多号主新书内容

    作者:Python进阶者

    来源:Python爬虫与数据挖掘

    /前言/

       在现代社会中,我们出行坐公交经常会看到二维码,支付宝微信收款也会有二维码扫一扫,那么这些二维码是怎样生成的了,今天我们不研究二维码的原理,只教大家如何制作属于自己的二维码。

    /项目目标/

        自己用程序打造一款属于自己的个性二维码。

    /项目准备/

    编辑器:sublime text 3    

    浏览器:360浏览器    

    模块:MyQR

    /实现步骤/

    一、分析网站二维码生成

    在实践前我们可以先看看网站上的二维码生成。

    在这里我要分享一个二维码网址,算是知名度比较大的二维码在线生成工具:草料二维码。

    它支持很多种生成二维码的方式:

    可以看出生成种类还是挺丰富的,基本上能满足我们所有的要求,而且他还有很多其他丰富的功能。最重要的是所有功能都免费。

    这样就完成了一个文本二维码,我们只要用扫码工具一扫就能看到‘任性的90后boy’这几个字。

    二、模块生成

    下面我们来用命令集制作属于自己的二维码,今天给大家介绍一个神器:myqr模块。

    它的操作方法比较简单,只需在cmd窗口中操作即可。

    1.安装

    pip install myqr
    

    2.基本用法

    可以看出它生成一张照片,而且我把它找出来了,真的太机智啦~

    打开我的微信一扫,显示的就是 ‘/?’,原谅我还没从cmd的命令中缓过神来。下面我们来看看帮助文件能给我们什么答案吧。

    显示的包的内容是他可以是一个脚本也可以是一个命令行,还是挺强大的,先去看它的源代码吧。

    通过分析我知道了这个工具的确强大,而且参数也不多,比较简单。下面是我总结它的参数含义,不知道对不对:

    words:单词,应该是内容
    version:版本
    level:级别
    picture:背景图
    colorized:颜色
    contrast:对比度
    brightness:亮度
    save_name:名称
    save_dir:路径
    

    3.生成原始二维码

    那么说淦就淦,我们先来生成张简单的吧。

    可以看到成功,通过扫码,很顺利就扫到hello。

    4.生成带背景图的二维码

    不过,这样的二维码实在是太普通了,我们可不可以在丰富下它的功能呢?答案当然是可以的。比方说我们给它加个背景图。

    生成出来了,不过有点丑。

    5.生成带颜色的二维码

        我想着应该可以给二维码加点颜色。于是乎加了一句代码就生成了,简单来说就是一个参数就ok。

       它就是colorized,只要将它设为你True即可显示背景图的颜色,背景图有了颜色,自然二维码也会有。

    6.修改二维码大小

    看起来像那么回事了,不过这个二维码会不会太小了,给它整大点,通过查文档得知只需更改它的version值即可,有点想不通,version不是版本的意思吗,怎么到你那儿就成大小了?难道不是size吗,不管了,言归正传。

    嗯嗯,现在有点像样了 。

    7.动态二维码生成

    其实我们在这里要想生成动态二维码也很简单,只需将生成类型和背景图片设置为gif即可。

    from MyQR import myqr
    myqr.run(words='hello',version=10,picture='12.gif',colorized=True,save_name='hello.gif',save_dir='./Game2')
    

    /小结/

        其实MyQr还可以通过命令行来操作生成二维码,但是我们Python程序员天生就很Python,所以还是Python好。

        通过对二维码的了解使我知道了它的神器之处,原来一个二维码如此简单就能生成出来,也惊叹世人的伟大与不朽。

        想学习更多关于Python的知识,可以参考学习网址:http://pdcfighting.com/

    ◆ ◆ ◆  ◆ ◆麟哥新书已经在当当上架了,我写了本书:《拿下Offer-数据分析师求职面试指南》,目前当当正在举行100-50活动,大家可以用相当于原价5折的预购价格购买,还是非常划算的:
    
    
    
    
    
    
    数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。
    管理员二维码:
    猜你喜欢
    ● 卧槽!原来爬取B站弹幕这么简单● 厉害了!麟哥新书登顶京东销量排行榜!● 笑死人不偿命的知乎沙雕问题排行榜
    ● 用Python扒出B站那些“惊为天人”的阿婆主!● 你相信逛B站也能学编程吗
    
    展开全文
  • 今天我们就用python 5行代码 生成一个二维码,并且是个性二维码,想你所想的,先看效果图,准备好微信扫一扫,看看扫到什么惊喜呢?普通的二维码是不是有一点单调,虽然可以修改其颜色修改颜色和大小带有背景图的...

    二维码满天飞,

    随便扫一扫就能扫到不一样的内容。

    有没有好奇什么是二维码?

    又是怎么生成的呢?

    今天我们就用python 5行代码 生成一个二维码,并且是个性的二维码,想你所想的,先看效果图,准备好微信扫一扫,看看扫到什么惊喜呢?

    普通的二维码

    是不是有一点单调,虽然可以修改其颜色

    修改颜色和大小

    带有背景图的二维码

    背景图二维码是不是更容易宣传自己的产品呢?

    背景图片可以是任意的图片。

    动图二维码

    看到这样的二维码

    是不是特别想扫一扫呢?

    Python代码实现

    Python中有一个专门生成二维码的库,叫MyQR. 安装非常简单,直接使用pip安装。如果使用的是Python三剑客(扫码上面加入了解),直接点击按钮安装即可

    pip install MyQR

    安装完成以后直接倒入即可,如下代码。

    from MyQR import myqr

    然后使用库中的run方法生成二维码,代码如下。也可以扫码加入,手把手教你如何生成个性二维码。

    #普通的二维码

    myqr.run(

    words,

    save_name= '普通的二维码.png'

    )

    #带图片

    myqr.run(

    words,

    picture = 'xxx/logo2.png',

    colorized = True,

    save_name = 'logon_Python.png'

    )

    #动图

    myqr.run(

    words, #需要生成的二维码网址链接

    picture="xxx/logo/dongtu.gif",  #动态图

    colorized=True, #彩色的还是黑白的

    save_name='Python2.gif', #保存为.gif格式否则不是动图

    )

    什么是二维码?

    二维码 (2-dimensional bar code),是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的。

    因此,在转换的过程中,离不开编码压缩方式。在许多种类的二维条码中,常用的码制有:Data Matrix, Maxi Code, Aztec, QR Code, Vericode, PDF417, Ultracode, Code 49, Code 16K等。

    二维码在现实生活中的应用越来与普遍,归于功于 QR code 码制的流行。我们常说的二维码就是它。所以,二维码又被称为 QR code。

    QR code 是一种矩阵式二维条码(又称棋盘式二维条码)。它是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”,点的排列组合确定了矩阵式二维条码所代表的意义。

    二维码结构

    我们的目的是要使用 Python 生成 QR 码,那我们需要先了解二维码(QR 码)的结构。根据标准(ISO/IEC 18004),我们可以了解到 QR 码结构如下:

    1) 功能图形

    功能图形是不参与编码数据的区域。它包含空白区、位置探测图形、位置探测图形分隔符、定位图形、校正图形五大模块。

    空白区

    空白区顾名思义就是要留空白。因此,这里不能有任何图样或标记。这样才能保证 QR 能被识别。

    位置探测图形

    这个有点类似中文的“回”字。在 QR 码中有个这样的标识,它分别的左上、右上和左下角。作用是协助扫描软件定位 QR 码并转换坐标系。我们在扫描二维码的时候,不管是竖着扫、横着扫、斜着扫都能识别出内容,主要是它的功劳。

    位置探测图形分隔符

    主要作用是区分功能图形和编码区域。

    定位图形

    它由黑白间隔的各自各自组成的线条。主要用于指示标识密度和确定坐标系。原因是 QR 码一种有 40 个版本,也就是说有 40 种尺寸。每种二维码的尺寸越大,扫描的距离就越远。

    校正图形

    只有 Version 2 及以上的QR码有校正标识。校正标识用于进一步校正坐标系。

    2) 编码区域

    编码区域是数据进行编码存储的区域。它由格式信息、版本信息、数据和纠错码字三部分构成。

    格式信息

    所有尺寸的二维码都有该信息。它存放一些格式化数据的信息,例如容错级别、数据掩码,和额外的自身 BCH 容错码。

    版本信息

    版本信息是规定二维码的规格。前面讲到 QR 码一共有 40 种规格的矩阵(一般为黑白色),从21x21(版本1),到177x177(版本40),每一版本符号比前一版本 每边增加4个模块。

    数据和纠错码

    主要是存储实际数据以及用于纠错码字。

    二维码绘制过程

    二维码已经是有一套国际标准,绘制二维码过程的严格按照标准来执行。这个过程是比较复杂,我自己也是看了大概,然后总结出大致绘制过程。如果你想深入了解绘制细节,可以阅读标准。

    二维码的绘制大概过程如下:

    1)在二维码的左上角、左下角、右上角绘制位置探测图形。位置探测图形一定是一个 7x7 的矩阵。

    2)绘制校正图形。校正图形一定是一个 5x5 的矩阵。

    3)绘制两条连接三个位置探测图形的定位图形。

    4)在上述图片的基础上,继续绘制格式信息。

    5)接着绘制版本信息。

    6)填充数据码和纠错码到二维码图中。

    7)最后是绘制蒙版图案。因为按照上述方式填充内容,可能会出现大面积的空白或黑块的情况,导致扫描识别会十分困难。所以需要对整个图像与蒙版进行蒙版操作(Masking),蒙版操作即为异或 XOR 操作。在这一步,我们可以将数据排列成各种图片。

    声明:文章收集于网络,如有侵权,请联系小编及时处理,谢谢!

    欢迎加入本站公开兴趣群

    软件开发技术群

    兴趣范围包括:Java,C/C++,Python,PHP,Ruby,shell等各种语言开发经验交流,各种框架使用,外包项目机会,学习、培训、跳槽等交流

    QQ群:26931708

    Hadoop源代码研究群

    兴趣范围包括:Hadoop源代码解读,改进,优化,分布式系统场景定制,与Hadoop有关的各种开源项目,总之就是玩转Hadoop

    QQ群:288410967

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

    2021-11-05 16:39:34
    python生成个性二维码 一.背景介绍 最近想把自己的博客,生成一个二维码,java实现起来相对python来说需要使用较多的代码,所以使用python来完成此操作,挺好玩的。 二.类库安装 MyQR是一个能够生成自定义二维码的第...
  • Python制作个性二维码

    2020-08-07 15:05:07
    如何用Python制作个性二维码呢,比如制作有背景图片的二维码、或者是动图二维码? 今天,梅朵就来给大家演示:Python制作此类个性二维码的方法! 很多人学习python,不知道从何学起。 很多人学习python,掌握了...
  • 生成带logo的个性二维码——个性二维码生成扫描工具 VQrCodeSpec
  • 课程背景1.1 课程目的本课程的主要目的是让学员掌握云服务器CVM、对象存储COS的配置流程,同时掌握使用Python中的MyQR包生成个性二维码的过程。最终可以结合Python的Flask框架和MyQR包,实现一个生成图片二维码的...
  • 教你用Python生成个性二维码

    千次阅读 2018-11-17 10:54:24
    编程就像做爱,你得为一个错误提供一辈子的支持  之前见到的二维码都是这样的...这个库使用起来非常简单,几行代码就能实现个性化的二维码生成 qr=qrcode.QRCode( version=2, error_correction=qrcode.ERRO...
  • Python 生成个性二维码

    千次阅读 热门讨论 2018-08-06 10:54:39
    本课程通过调用MyQR接口来实现生成个人所需二维码,并可以设置二维码的大小、是否在现有图片的基础上生成、是否生成动态二维码。 1.2 知识点 Python3基础 MyQR库 1.3 效果截图 1.3.1 普通二维码(浏览器扫码,...
  • 个性二维码,使用形状图形生成个性二维码 ,色值变化的图形。
  • Python生成个性二维码: 通过调用MyQR接口来实现生成个人所需二维码,并可设置二维码的大小/是否在现有图片的基础上生成/是否生成动态二维码 在线实验:https://www.shiyanlou.com/courses/1126/learning/ 二、...
  • 首先,这里我使用的是python3.9。 需要下载MyQR库——可以使用pip install MyQR进行下载 ... picture=r'url2',#这是你二维码图像的文件位置(注意此时生成的事黑白图片)(可以是.jpg,.png,.gif) co.
  • 代码生成个性二维码

    2020-04-01 19:01:46
    嘻,小编刚刚偷学到了一个用自己照片生成二维码的小代码! getget!!! 首先安装MyQR模块!(MyQR支持动态图哦!) 安装好之后就开始愉快的写代码时刻! from MyQR import myqr myqr.run( words='GXH666', #里面...
  • [273]python生成个性二维码

    万次阅读 多人点赞 2018-07-08 14:07:52
    现在,我们生活中到处可以看到二维码。它有啥好处呢?它具有信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点。 我们生成的东西一般都在电脑上。如果弄到移动设备上,用到最多的是扫码。在...
  • python 生成个性二维码

    2020-07-05 10:38:29
    gif 图片二维码 带背景图二维码(原谅我背景图片没选好) 2. 依赖库 核心库myqr pip install myqr 其它依赖库安装pip install pip install pillow, numpy, imageio 3. 核心代码 我这里是F盘下的joy文件夹 ...
  • 首先,简单介绍一下二维码二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型...
  • python制作个性二维码

    2020-06-03 15:41:44
    通过MyQR库制作二维码 生成动态二维码 from MyQR import myqr import os os.chdir('C:\\Users\\lmy\\Pictures\\Saved Pictures') #切换到图片所在的目录 myqr.run(words='https://blog.csdn.net/weixin_44803791',...
  • 个性二维码

    千次阅读 2017-03-23 11:21:45
    全球识别种类最多、使用最便捷的二维码生成识别工具,采用最先进的...【名片定制】快速生成个性二维码名片,拒绝枯燥无味 【背景定制】用户可以根据自身需求,选择自己喜爱的照片作为二维码背景 【Logo定制】用户
  • python调用MyQR库生成个性二维码

    万次阅读 2018-07-26 16:51:35
    本课程通过调用MyQR接口来实现生成个人所需二维码,并可以设置二维码的大小、是否在现有图片的基础上生成、是否生成动态二维码。 本课程主要面向Python3初学者。 1.2 知识点 Python3基础 MyQR库 1.3 效果截图 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,104
精华内容 5,241
关键字:

个性二维码

友情链接: PrintFil.ZIP