主题
修改微信小程序二维码logo
如何替换下图小程序码中间的logo,从图1
修改为图2
图1

图2

源代码
python
import os
import numpy as np
from PIL import Image, ImageDraw
def create_circular_mask(h, w, center=None, radius=None):
"""创建圆形蒙版"""
if center is None: # 默认使用图像中心
center = (int(w/2), int(h/2))
if radius is None: # 默认使用最小边的一半
radius = min(center[0], center[1], w-center[0], h-center[1])
Y, X = np.ogrid[:h, :w]
dist_from_center = np.sqrt((X - center[0])**2 + (Y - center[1])**2)
mask = dist_from_center <= radius
return mask
def replace_qrcode_logo(qrcode_path, logo_path, output_path, logo_radius=100,crop_logo_x_offset=0,crop_logo_y_offset=0):
"""替换二维码中心的logo,并将logo缩小指定比例"""
print(qrcode_path, logo_path, output_path, logo_radius,crop_logo_x_offset,crop_logo_y_offset)
# return
try:
# 使用 PIL 读取图片以保持透明通道
qrcode = Image.open(qrcode_path).convert('RGBA')
logo = Image.open(logo_path).convert('RGBA')
print(logo.size)
# 获取尺寸
# 将logo调整为200x20
logo_width, logo_height = 280, 280
logo = logo.resize((logo_width, logo_height))
# 获取尺寸
qr_width, qr_height = qrcode.size
# 计算logo中心点
logo_center_x, logo_center_y = logo_width // 2-crop_logo_x_offset, logo_height // 2-crop_logo_y_offset
# 创建圆形蒙版
mask = create_circular_mask(logo_height, logo_width,
center=(logo_center_x, logo_center_y),
radius=logo_radius)
mask = Image.fromarray((mask * 255).astype('uint8')).convert('L')
# 创建圆形logo
circular_logo = Image.new('RGBA', (logo_width, logo_height), (0, 0, 0, 0))
circular_logo.paste(logo, (0, 0), mask)
# 裁剪和缩放logo
vertical_offset = 0
box = (
logo_center_x - logo_radius,
logo_center_y - logo_radius-vertical_offset,
logo_center_x + logo_radius,
logo_center_y + logo_radius-vertical_offset
)
cropped_logo = circular_logo.crop(box)
# cropped_logo.save("cropped_logo.png", 'PNG')
# # 计算在二维码上的位置
qr_center_x, qr_center_y = qr_width // 2, qr_height // 2
x_offset = qr_center_x - logo_radius
y_offset = qr_center_y - logo_radius
# 将logo粘贴到二维码上
qrcode.paste(cropped_logo, (x_offset, y_offset), cropped_logo)
# 保存结果
qrcode.save(output_path, 'PNG')
print(f"成功替换logo: {output_path}")
return True
except Exception as e:
print(f"处理图片时出错: {str(e)}")
return False
使用方法
python
replace_qrcode_logo(src_path,logo_path,src_path,logo_radius=100,crop_logo_x_offset=0,crop_logo_y_offset=-40)
qrcode_path
:二维码图片路径。logo_path
:需要替换到二维码中心的 logo 图片路径。output_path
:输出结果的保存路径。logo_radius
:logo 的半径大小(默认为 100)。crop_logo_x_offset
和crop_logo_y_offset
:用于调整 logo 中心点的偏移量