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

PIL图片合成旋转缩放的更多相关文章

  1. Android -- 图片处理, 画画板,缩放,旋转,平移,镜面,倒影,图片合成,颜色处理

    1. 画画板 示例代码 public class MainActivity extends Activity { private ImageView iv; private Bitmap baseBi ...

  2. pyhton图片合成模块-PIL

    文章链接:https://www.cnblogs.com/lilinwei340/p/6474170.html python PIL实现图片合成   在项目中需要将两张图片合在一起.遇到两种情况,一种 ...

  3. Android DIY之路 (一) 指定区域多图片合成 放大 缩小 镜像 旋转 等(转)

    惯例先看效果图 // 注意做类似这种模板功能时候 方位由后台数据提供,这里我们用假数据 4个点 或者xy 加区域来做示例 //一开始我们公司用的是透明盖住 操作图片 但发现 局限性较大.后来直接限定区 ...

  4. Android图片旋转,缩放,位移,倾斜,对称完整示例(一)——imageView.setImageMatrix(matrix)和Matrix

    MainActivity如下: import android.os.Bundle; import android.view.MotionEvent; import android.view.View; ...

  5. PHP图片加水印文字及图片合成缩放

    <?php //图片添加文字水印 /*$bigImgPath = 'background.png'; $img = imagecreatefromstring(file_get_contents ...

  6. 【Thumbnailator】java 使用Thumbnailator实现等比例缩放图片,旋转图片等【转载】

    Thumbnailator概述:     Thumbnailator是与Java界面流畅的缩略图生成库.它简化了通过提供一个API允许精细的缩略图生成调整生产从现有的图像文件的缩略图和图像对象的过程, ...

  7. Android图片旋转,缩放,位移,倾斜,对称完整演示样例(一)——imageView.setImageMatrix(matrix)和Matrix

    MainActivity例如以下: import android.os.Bundle; import android.view.MotionEvent; import android.view.Vie ...

  8. 【CSS3动画】transform对文字及图片的旋转、缩放、倾斜和移动

    前言:之前我有写过CSS3的transform这一这特性,对于它的用法,还不是很透彻,今天补充补充,呵呵 你懂的,小司机准备开车了. a)再提一提transform的四个属性 ①旋转--->ro ...

  9. ImageCombiner - Java服务端图片合成的工具包,好用!

    自己的第一个也是唯一一个开源项目,因为平时比较懒,很少做宣传,今天刚好突破160个star,发到园子里推荐给大家,算是庆祝一下,哈. 项目地址:https://gitee.com/opensource ...

随机推荐

  1. BZOJ3811 玛里苟斯(线性基+概率期望)

    k=1的话非常好做,每个有1的位都有一半可能性提供贡献.由组合数的一些性质非常容易证明. k=2的话,平方的式子展开可以发现要计算的是每一对位提供的贡献,于是需要计算每一对位被同时选中的概率.找出所有 ...

  2. vue项目 axios封装第二弹

    import axios from "axios"; import qs from "qs"; import { Message, MessageBox } f ...

  3. l洛谷 (水题)P4144 大河的序列

    题目戳 Solution: 这题前面都是废话,关键的一句就是本题求的是序列中连续一段的相与值(&)+相或值(|)最大,然后对这个值进行快速幂取模.考虑到两个数相与最大能得到的就是这两个数中的最 ...

  4. Linux内核分析6

    周子轩 原创作品 转载请注明出处 <Linux内核分析>MOOC课程:http://mooc.study.163.com/course/USTC-1000029000 一.视频笔记 1. ...

  5. linux下shell显示-bash-3.2$ 不显示路径解决方法

       linux操作下脚本不小心误删了很多东西,变成了下面的样子 在linux shell中不显示路径了,用起来很不方便. 如何改为显示路径的shell呢 步骤如下: vi ~/.bash_profi ...

  6. word----遇到问题-----word中插入的图片无法左对齐----格式按钮为灰色

    当我们在用word时,有时要插入图片,却发现,插入的图片只在中间位置,不能拖到左边,这时怎么办呢 主要是图层的高低原因导致的不能拖动. 这个时候我们只需要设置一下图片的图层类型即可. 对着图片右键在设 ...

  7. Linux(五)shell编程基础

    一.Linux shell简介 1.shell概述 Shell 是用户与内核进行交互操作的一种接口,目前最流行的 Shell 称为 bash Shell          Shell 是一门编程语言& ...

  8. 【bzoj4520】K远点对

    Portal --> bzoj4520 Description 给你平面内\(n\)个点的坐标,求欧氏距离下第\(k\)远的点对 Solution 因为kd其实..严格来说挺不熟的用的太少了qw ...

  9. bzoj 1053

    代码: //本题要求不超过n的因子最多的最小的数,我们知道因子的个数可以有素因子的指数得出,题目限制n是2e9,我们可以排除掉一些情况然后暴力 //对于一个数必然是因子越小他的因子数越多,所以枚举最小 ...

  10. 「Django」rest_framework学习系列-路由

    自动生成4个url路由:from rest_framework import routersrouter = routers.DefaultRouter()router.register(r'wrx' ...