问题描述
我有2张图片,我想一张一张地合并在一起。
第一个图像是用户上传的餐厅徽标,另一个图像是我在用户上传餐厅Menu .pdf文件后生成的QR码(QR码指向菜单文件的URL)。如何使公司徽标正确缩放并位于新制作的QR码上方?
理想情况下,我想将它们分开并具有一个新功能,使它们合并,并在QR码上方添加徽标。这样,用户可以选择是否要使用普通QR码或带有徽标的QR码。否则,如果不可能,则能够生成带有永久嵌入徽标的QR码。
在Models.py中制作QR码
class Menu(models.Model):
name = models.CharField(max_length=50)
restaurant = models.ForeignKey(Restaurant,on_delete=models.CASCADE)
menuFile = models.FileField(upload_to='menus')
qr_code = models.ImageField(upload_to='qr_codes',blank=True)
uploadDate = models.DateTimeField(auto_now_add=True)
class Meta:
unique_together = ('restaurant','name',)
def __str__(self):
return(self.name)
def save(self,*args,**kwargs):
qr = qrcode.QRCode(
version=8,box_size = 10,border=5,)
link = f'w w w.XX.com/{self.name}'
qr.add_data(link)
qr.make(fit=True)
img = qr.make_image(fill='black',back_color='white')
fname = f'{self.name}QRCode.png'
buffer = BytesIO()
img.save(buffer,'PNG')
self.qr_code.save(fname,File(buffer),save=False)
super().save(*args,**kwargs)
餐厅模型
class Restaurant(models.Model):
account = models.ForeignKey(CustomUser,on_delete=models.CASCADE)
name = models.CharField(max_length=70)
address1 = models.CharField(max_length=100)
address2 = models.CharField(max_length=100)
restaurant_city = models.CharField(max_length=100)
zip_postal = models.CharField(max_length=20)
logo = models.ImageField(upload_to='logos',blank = True)
date = models.DateTimeField(auto_now_add=True)
解决方法
此代码段应按您希望在Pillow中执行的操作。我将其保存到Django或保留原始文档的部分由您决定。结果如下,以及原始的(假设的)餐厅徽标。
import qrcode
from PIL import Image
# Create qr code instance
qr = qrcode.QRCode(version=1,error_correction=qrcode.constants.ERROR_CORRECT_H,box_size=4,border=.2)
# Add data
text = "www.this-is-some-url.com"
qr.add_data(text)
qr.make(fit=True)
# Create an image from the QR Code instance
qr_img = qr.make_image(fill_color='black',back_color='white')
# Load the logo
logo_img = Image.open('restaurant.jpeg')
# Scale the logo image. The width of the scaled logo shall be equal to the width of the QR code
qr_width,qr_height = qr_img.size
logo_current_width,logo_current_height = logo_img.size
scaling_factor = qr_width / logo_current_width
logo_new_height = int(scaling_factor * logo_current_height)
logo_new_size = (qr_width,logo_new_height)
logo_img = logo_img.resize(logo_new_size)
# Create an empty image to paste both images on
margin = 20
result = Image.new(mode='RGB',size=(qr_width,qr_height + margin + logo_new_height),color='white')
result.paste(logo_img,(0,0))
result.paste(qr_img,qr_height + margin))
result.save('restaurant_qr.jpg')
结果:
原始徽标: