Python 生成帶Logo的圓角帶邊框二維碼


Python 生成二維碼方式就不累述了,不會的自己百度吧

但python生成的二維碼太難看了,要么沒有logo,要么logo直接貼進去的,難看死了,有的也處理了一下,但沒有圓角,也難看:

以下:是不是覺得后邊幾個好看!!!

 

直接上代碼:

 

 1 # coding = utf-8
 2 # 二維碼生成
 3 
 4 import qrcode
 5 from PIL import Image, ImageDraw
 6 
 7 
 8 # 設置圓角
 9 def circle_crop_image(im, radii):
10     # 創建一個黑色背景的畫布
11     circle = Image.new('L', (radii * 2, radii * 2), 0)
12     # 畫黑色方形
13     draw = ImageDraw.Draw(circle)
14     # 畫白色圓形
15     draw.ellipse((0, 0, radii * 2, radii * 2), fill=255)
16     # 把原圖轉換成RGBA模式,增加alpha通道
17     img = im.convert("RGBA")
18     w, h = img.size
19     # 畫4個角(將整圓分離為4個部分)再粘貼到alpha通道
20     alpha = Image.new('L', img.size, 255)
21     # 左上角
22     alpha.paste(circle.crop((0, 0, radii, radii)), (0, 0))
23     # 右上角
24     alpha.paste(circle.crop((radii, 0, radii * 2, radii)), (w - radii, 0))
25     # 右下角
26     alpha.paste(circle.crop((radii, radii, radii * 2, radii * 2)), (w - radii, h - radii))
27     # 左下角
28     alpha.paste(circle.crop((0, radii, radii, radii * 2)), (0, h - radii))
29     # 白色區域透明可見,黑色區域不可見
30     img.putalpha(alpha)
31     return img
32 
33 
34 # 生成二位碼
35 def create_qr_code(url, icon_file, file_name, save_path):
36     qr = qrcode.QRCode(
37         version=5,
38         # 設置容錯率為最高
39         error_correction=qrcode.ERROR_CORRECT_H,
40         box_size=5,
41         border=1,
42     )
43     qr.add_data(url)
44     qr.make(fit=True)
45     img = qr.make_image()
46     img = img.convert("RGBA")
47     icon = Image.open(icon_file)
48     # 把RGB的圖轉換成RGBA模式,處理alpha透明通道(后邊替換透明為白色)
49     icon = icon.convert("RGBA")
50     w, h = img.size
51     icon_w, icon_h = icon.size
52     # 超過80的壓縮到80
53     if icon_w > 80:
54         icon = icon.resize((80, 80), Image.ANTIALIAS)
55         icon_w, icon_h = icon.size
56         w = int((w - 80) / 2)
57         h = int((h - 80) / 2)
58     else:
59         w = int((w - icon_w) / 2)
60         h = int((h - icon_h) / 2)
61     # 把png背景色轉換為白色,避免處理裁剪圓角時出現黑邊
62     w_d = Image.new('RGBA', icon.size, (255, 255, 255))
63     w_d.paste(icon, (0, 0, icon_w, icon_h), icon)
64     # r = icon_w // 15
65     r = 6
66     icon = circle_crop_image(w_d, r)
67     # 白底圖
68     white_img = Image.new("RGBA", (icon_w + 6, icon_h + 6), (255, 255, 255))
69     white_img = circle_crop_image(white_img, r)
70     # 灰底圖
71     gray_img = Image.new("RGBA", (icon_w + 2, icon_h + 2), (230, 230, 230))
72     # 灰底圖圓角處理
73     gray_img = circle_crop_image(gray_img, r)
74     # 粘貼灰底圖
75     white_img.paste(gray_img, (2, 2), gray_img)
76     # 粘貼白圖
77     img.paste(white_img, (w - 2, h - 2), white_img)
78     # 粘貼icon
79     img.paste(icon, (w + 1, h + 1), icon)
80     save_file = save_path + file_name + '.png'
81     img.save(save_file, quality=100)
82     # img.show()
83     return save_file
84 
85 
86 if __name__ == '__main__':
87 
88     icon_path = '/Users/drew/.jenkins/workspace/Android/app/src/main/res/mipmap-xxhdpi/ic_collect_icon.png'
89     save_path = '/Users/Work/PycharmProjects/FM_Build_Packaging/resources/img/qrcode'
90     create_qr_code('http://www.thecover.cn', icon_path, 'cs', 'save_path')

 

以上,都有注釋。

另外說明一下,PIL在python3.x版本需要安裝的是pillow。

遇到的坑:

Image.open('file\\img\\80.png')  這個地方打開圖片時候報錯:

raise OSError(message + " when reading image file")
OSError: broken data stream when reading image file

加了以下代碼:

from PIL import Image, ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True

 

不報錯了,但是一直沒法把icon粘貼過去,后來才知道,icon沒有讀取出來,原圖有問題,圖片估計是損壞了,換個圖就ok了!

所以,不要以為代碼不報錯了,就沒問題了,哎,坑~~~

再者,我們APP的icon都是.png,模式都是RGB,都有透明背景,無論是壓縮后裁剪還是裁剪后壓縮,有的APP的logo都會出現黑色邊框:

這個問題困擾了差不多半個月,找了各種方法都沒解決掉,偶然間看到有人把透明背景替換成白色,突然間就找到怎么解決黑邊的問題:

為什么不把圖片的透明層直接替換成白色呢~~哈哈哈~~

替換成白色背景時候原圖一定要轉換成RGBA,用mask覆蓋就行。

有遇到坑的歡迎留言交流。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM