-
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); }
}
更多相关内容 -
个性二维码制作软件.zip
2020-06-12 11:16:14如何用python语言编写,个性二维码制作工具。支持各种格式图片(gif等)。分两期,第一期先将软件分享给大家,第二期代码层面分享讲解 -
python实现个性二维码
2018-08-06 11:00:20通过python可以简单的实现网址转二维码,简单又有趣,还可以自定义自己喜欢的背景图片,支持gif,png等背景图片的加载,快来试试吧,制作独一无二的个性二维码,拿起手机扫一扫,别是一番滋味,很爽,嘿嘿 -
个性二维码制作工具 v1.0.zip
2019-07-14 07:07:18个性二维码制作工具软件是一款二维码个性制作软件,可根据个性化需要,调整二维码的颜色。 个性二维码制作工具软件的功能与特点: 1.根据输入的内容自动检测编码格式,自动生成二维码 2.根据内容的长度自动调整... -
基于Python生成个性二维码过程详解
2020-09-17 18:49:16主要介绍了基于Python生成个性二维码过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 -
微信公众平台开发教程(六)获取个性二维码的实例
2020-09-01 02:00:01二维码的用处有很多,本篇文章主要介绍了微信公众平台开发教程(六)获取个性二维码的实例,有兴趣的可以了解一下。 -
教你制作专属个性二维码!将照片制作成二维码图片!给二维码添加背景图片!
2020-05-24 19:39:50有人通过制作个性二维码致富,今天社长凯先生就要对不住啦(不是抢饭碗,是打破饭碗~)公开这种赚钱方法的所有具体操作方法~手把手教你(嘴对嘴超超超...详细教学~) 图中各种个性二维码的制作,其实方法非常简单...前段时间,在刷朋友圈的时候竟发现一条致富发家新道路!有人通过制作个性二维码致富,今天社长凯先生就要对不住啦(不是抢饭碗,是打破饭碗~)公开这种赚钱方法的所有具体操作方法~手把手教你(嘴对嘴超超超...详细教学~)
图中各种个性二维码的制作,其实方法非常简单!真的分分钟学会~有的时候感觉自己在赚钱方面,还是太佛系啦!我不得不佩服微商,这点我还是应该多向广大微商朋友们学习学习!多多指教~
重点这次安卓苹果用户都有,毕竟还是要“雨露均沾”~
方法其实很简单,只需要简单几步就可以完成制作,重要的是制作工具的选择,有了工具,聪明的你不用教就可以学会,不会的话,那你就不...会往下看啊~(sorry,有些激动~)
一、安卓篇
安卓用户可以使用Qart App自助快速制作,个人感觉没什么操作难度~那么怎样下载Qart呢?不要着急,这个我们后面会说到!
Qart是开源免费的,除了制作合成个性二维码外,还可以扫描或识别二维码~
如果你自己有能力想要更多功能的话,可以去编译出来一个版本~在GitHub上可以找到项目地址。
Qart 有普通、图片、图标、嵌入四种模式,普通模式与我们平常看到的很多二维码一样,就是一个二维码,并没有过多的修饰;图片模式是我们今天内容的重点,就是将二维码和图片进行合成;图标模式是在二维码中间加入图片、logo,和我们的微信名片二维码样式类似;嵌入模式就是以海报图片部分为背景生成二维码,有点一点马赛克滴味道~
图片模式支持黑白、彩色以及GIF动图,黑白和彩色区别不大,彩色更加漂亮,动图就是背景支持GIF动图!
我们这里以彩色为例,其他的方法步骤一样类似!
既然是“嘴对嘴”教学,那么就要一步一步来、详细详细再详细...接下来我们就说说具体制作过程~
1、首先我们需要准备好二维码(网址、文本内容...)可以先不选择模式,然后点击右上角的倒三角▼选择文本,在刚弹出的那一栏我们可以直接输入网址或者文本内容,也可以点击右侧的二维码图标,选择扫描或读取准备好的二维码,最后点击确定自动返回主界面!
扫描和读取还是有些区别,扫描是调用手机摄像头扫码获取,而读取则是通过选择相册中保存好的二维码图片获取。
2、接下来,我们就是将二维码和背景图片进行合成。
首先点击右上角的图片图标,选择相册中准备好的背景图片,选好背景图片以后,再点击右上角的箭头图标按照提示操作就行!
接下来,根据提示选择合成二维码是黑白还是彩色的,如果选择彩色的话,还需要选择颜色,选取的颜色是需要注意,建议选择与背景图片颜色对比强烈的颜色,否则会识别失败!!
以上步骤设置完成,就会马上生成。
我们可以点击右上角▼按钮进行保存,也可以进行撤销、换色以及更改模式!
安卓手机生成合成个性图片二维码的教程就到这里~接下来我们来说说苹果手机怎样制作个性图片二维码!
二、苹果篇
苹果手机,我们可以使用EFQRcode和二维码秀秀这两款App来制作,大家可以在App Store搜索下载。两款App都完全免费、无内购、无广告!
(一)首先,我们先说说二维码秀秀,这个App界面比较简单(陋),但是不影响我们使用。
打开以后,界面非常简单,只有“识别图中二维码”、“生成制作二维码”以及扫描二维码图标三个菜单,简单吧!
1、第一步仍然是准备好二维码(网址或者文本内容均可),我们可以点击“识别图中二维码”识别手机相册中的二维码图片,也可以点击右上角的扫描按钮调用手机摄像头扫码,如果是网址或者文本内容可以点击“生成制作二维码”以后再输入。
2、我们只需要将上图中的相关选项设置完成,包括二维码信息,背景图片,图片中心的icon图标...设置完成以后保存二维码就可以啦!这个没有什么特别要说明的!
(二)说完二维码秀秀,我们再说一下另一款App【EFQRcode】
与二维码秀秀相比,这款App不太友好,全是英文界面,所以对于英语不好的人稍显麻烦一些。
“EFQRcode”也是开源的,项目地址同样也可以在GitHub上找到~
“EFQRcode”主界面同样非常简单。第一行是识别;第二行是生成。识别的时候只能从手机相册中选择二维码,不能调用摄像头扫码。
我们点击“Generator”进入详细参数设置界面,由于界面都是英文,所以我这里简单给大家对比翻译一下~
图片中的各个参数并不需要都了解,很多参数采用默认选项即可,不需要更改,我这里介绍几个比较常用的参数设置。
icon和watermark都可以选择App内置的图片,也可以点击“Select from system album”从手机相册中选择图片。
关于“watermarkMode”,“scaleToFill”按比例填满;“scaleAspectFit”适应屏幕比例;“scaleAspectFill”按屏幕比例填满,其他的依次为中心、顶部、底部、左、右、左上、右上、左下、右下。有什么区别自行研究~
关于“point Shape”的形状有方形、圆形与钻石三种选择~
设置完成以后,我们点击底部的“Create”生成即可!
生成好的个性二维码图片,我们可以点击“Save”保存到相册,点击“Back”返回修改参数设置!
注意:个性二维码在微信中大多数情况下都可以识别,但是不保证在其他App中也可以识别~请在使用环境下测试好!
关于怎样制作个性二维码的教程到此结束!感兴趣的小伙伴赶快去试试吧~哪里有问题的话可以在下方给我留言!
-
个性二维码制作工具 1.0
2013-09-10 14:31:53这个软件是从网络中搜集而来的,免费提供给大家!希望对你们有用处! -
手把手教你用Python打造一款属于你自己的个性二维码
2021-01-03 17:58:27公众号后台回复“图书“,了解更多号主新书内容作者: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行代码生成个性二维码
2020-12-10 17:53:06今天我们就用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:34python生成个性二维码 一.背景介绍 最近想把自己的博客,生成一个二维码,java实现起来相对python来说需要使用较多的代码,所以使用python来完成此操作,挺好玩的。 二.类库安装 MyQR是一个能够生成自定义二维码的第... -
Python制作个性二维码
2020-08-07 15:05:07如何用Python制作个性二维码呢,比如制作有背景图片的二维码、或者是动图二维码? 今天,梅朵就来给大家演示:Python制作此类个性二维码的方法! 很多人学习python,不知道从何学起。 很多人学习python,掌握了... -
生成带logo的个性二维码——个性二维码生成扫描工具 VQrCodeSpec
2013-12-02 14:34:07生成带logo的个性二维码——个性二维码生成扫描工具 VQrCodeSpec -
使用Python生成个性二维码
2020-11-21 03:30:45课程背景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 普通二维码(浏览器扫码,... -
仿腾讯 个性二维码,动物形状二维码 图片
2013-06-09 10:23:13个性二维码,使用形状图形生成个性二维码 ,色值变化的图形。 -
Python生成个性二维码详解!
2020-06-10 10:37:45Python生成个性二维码: 通过调用MyQR接口来实现生成个人所需二维码,并可设置二维码的大小/是否在现有图片的基础上生成/是否生成动态二维码 在线实验:https://www.shiyanlou.com/courses/1126/learning/ 二、... -
用python生成个性二维码
2021-09-30 20:40:09首先,这里我使用的是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:29gif 图片二维码 带背景图二维码(原谅我背景图片没选好) 2. 依赖库 核心库myqr pip install myqr 其它依赖库安装pip install pip install pillow, numpy, imageio 3. 核心代码 我这里是F盘下的joy文件夹 ... -
python之个性二维码制作
2020-05-29 19:05:05首先,简单介绍一下二维码:二维码又称二维条码,常见的二维码为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 效果截图 ...