# -*- coding:utf-8 -*- # @Author len # @Create 2023/10/16 19:58 import cv2 import qrcode from PIL import Image import random import numpy as np # 生成二维码图像 def makeQR(): # print(color_map) width = 300 # 图像宽度 # height = 300 # 图像高度 data = "https://www.example.com" # 要编码的数据 qr = qrcode.QRCode() qr.add_data(data) qr.make(fit=True) qr_img = qr.make_image() # 转换为RGBA图像,以便修改颜色 qr_img = qr_img.convert("RGBA") # 创建自定义颜色映射 color_map_list = [{ (0, 0, 0, 255): (255, 0, 0, 255) # 将黑色替换为红色 (R, G, B, Alpha) }, { (0, 0, 0, 255): (0, 255, 0, 255) # 将黑色替换为绿色 (R, G, B, Alpha) }, { (0, 0, 0, 255): (0, 0, 255, 255) # 将黑色替换为蓝色 (R, G, B, Alpha) }, { (0, 0, 0, 255): (255, 255, 0, 255) # 将黑色替换为黄色 (R, G, B, Alpha) }, { (0, 0, 0, 255): (0, 128, 0, 255) # 将黑色替换为深绿 (R, G, B, Alpha) }, { (0, 0, 0, 255): (144, 238, 144, 255) # 将黑色替换为浅绿 (R, G, B, Alpha) }, { (0, 0, 0, 255): (0, 0, 139, 255) # 将黑色替换为深蓝 (R, G, B, Alpha) }, { (0, 0, 0, 255): (173, 216, 230, 255) # 将黑色替换为浅蓝 (R, G, B, Alpha) }, { (0, 0, 0, 255): (153, 51, 255, 255) }, { # 不变 } ] color_map = random.choice(color_map_list) # 遍历图像的每个像素,根据颜色映射替换颜色 new_img_data = [] for item in qr_img.getdata(): new_color = color_map.get(item[:4], item[:4]) new_img_data.append(new_color) # 更新图像数据 qr_img.putdata(new_img_data) qr_img = qr_img.resize((width, width)) return qr_img def rotate_image(image, angle): image = np.array(image) # 转换为opencv # 获取图像的尺寸和中心点 h, w = image.shape[:2] center = (w // 2, h // 2) # 获取旋转矩阵 M = cv2.getRotationMatrix2D(center=center, angle=-angle, scale=1.0) # 进行仿射变换,borderValue设置为白色(255, 255, 255) rotated_image = cv2.warpAffine(src=image, M=M, dsize=(w, h), borderValue=(255, 255, 255)) return rotated_image def makecanvas(count, number): # 创建一个空白画布 canvas_width = 1200 canvas_height = 1200 background_color = (255, 255, 255) # 背景颜色(白色) canvas = Image.new("RGB", (canvas_width, canvas_height), background_color) images = [] for i in range(number): image = makeQR() # print() images.append(image) # 定义已放置图片的位置列表 placed_positions = [] # 设置旋转角度范围 min_rotation = 0 max_rotation = 360 # 在画布上放置图片 for image in images: placed = False while not placed: # 随机生成位置 x = random.randint(0, canvas_width - image.width) y = random.randint(0, canvas_height - image.height) # 随机生成旋转角度 rotation_angle = random.randrange(min_rotation, max_rotation) # 检查位置是否与已放置图片重叠 overlap = False for position in placed_positions: if ( x < position[0] + images[position[2]].width and x + image.width > position[0] and y < position[1] + images[position[2]].height and y + image.height > position[1] ): overlap = True break # 如果位置不重叠,则将图片粘贴到画布上,并更新已放置图片的位置列表 if not overlap: # rotated_image = image.rotate(rotation_angle) # 对图片进行旋转 rotated_image = rotate_image(image, rotation_angle) # 将NumPy数组转换为PIL图像对象 rotated_image = Image.fromarray(rotated_image) canvas.paste(rotated_image, (x, y)) placed_positions.append((x, y, len(placed_positions))) placed = True # 显示画布 # canvas.show() canvas.save(f'QRA4/{count}.jpg') for i in range(30): makecanvas(i, random.randint(3,5))