zoukankan      html  css  js  c++  java
  • PIL图片合成旋转缩放

    用PIL实现图片的旋转,缩放,合成

    我们需要知道合成位置的中心点坐标,用中心点坐标,不使用左顶点的坐标是由于缩放过程容易计算。

    假设A是局部透明的图片,我们希望把B放在A的底部,仅从A的透明部分显示B的部分。

    步骤就是,

    1、先创建空白的图片C,大小和A目标图片一样大。

    2、对B进行缩放到指定大小B0

    3、新建空白图片D,宽和高相等,等于B0的对角线长度,目的是防止旋转后丢失部分图像

    4、将B0放到D的中间并旋转指定角度得到E。

    5、将E合成到C的指定位置

    6、将A合成到C上

    from PIL import ImageFont
    from PIL import Image
    from PIL import ImageDraw
    import math
    
    
    def combine_image_with_transparency(templateImg, pos, input_img):
        #新建一张和目标图片同样大小的空白图片,颜色根据实际需要,这里是白色,透明的
        tmpImg = Image.open(input_img).convert('RGBA')
        pos = [float(point) for point in pos]
        center_x, center_y = pos[0], pos[1]
        dx = dy = 0
        tmpImg_size = tuple(int(x * pos[2]) for x in tmpImg.size)
        tmpImg = tmpImg.resize(tmpImg_size)
        x = center_x - tmpImg.size[0] / 2
        y = center_y - tmpImg.size[1] / 2
        w, h = tmpImg.size
        r = int(math.ceil(math.sqrt(w * w + h * h)))
        # 新建正方形
        empty_img = Image.new('RGBA', (r, r),(255, 255, 255, 255))
        dx = int((r - w) / 2.0)
        dy = int((r - h) / 2.0)
        empty_img.paste(tmpImg, (dx, dy))
        tmpImg = empty_img.rotate(pos[3])
        # 将旋转之后的透明部分填充为白色
        fff = Image.new('RGBA', tmpImg.size, (255,) * 4)
        tmpImg = Image.composite(tmpImg, fff, tmpImg)
        target.paste(tmpImg, (int(x - dx), int((y - dy))), tmpImg)
        target.paste(templateImg, (0,0), templateImg)
        return target
    
    if __name__ == '__main__':
        imageFile = Image.open('./1.png').convert("RGBA")
        pos = '226,169,0.205,-49'.split(',')
        imageFile = combine_image_with_transparency(imageFile, pos, './2.jpg')
        imageFile = imageFile.convert("RGB")
        imageFile.save('./out.png')
  • 相关阅读:
    MYSQL 神奇的操作insert into test select * from test;
    mysql innodb与myisam存储文件的区别
    centos 普通用户 和 root 相互切换方法
    MySQL
    mysql查看数据库表数量
    PHP是单线程还是多线程?
    PHP如何解决网站大流量与高并发的问题(一)
    PHP如何解决网站大流量与高并发的问题(二)
    Work at home, Work as a distributed team | TVP思享
    区块链上的虚拟开放世界游戏是怎样的?| TVP思享
  • 原文地址:https://www.cnblogs.com/lilinwei340/p/8169458.html
Copyright © 2011-2022 走看看