用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')