如何在Python中将两个图像一个接一个地连接起来?

问题描述

我有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')

结果:

restaurant_qr.jpg

原始徽标:

restaurant.jpeg

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...