'''

RGBA值:指定颜色中的红、绿、蓝和alpha(透明度)的值

RGBA                                            名称

(255,255,255,255)            White

(0,128,0,255)                     Green

(128,128,128,255)            Gray

(0,0,0,255)                                   Black

(255,0,0,255)                     Red

(0,0,255,255)                     Blue

(255,255,0,255)                          Yellow

(128,0,128,255)                          Purple

'''

from PIL import ImageColor

ImageColor.getcolor('red','RGBA')

Out[104]: (255, 0, 0, 255)

ImageColor.getcolor('RED','RGBA')

Out[105]: (255, 0, 0, 255)

ImageColor.getcolor('Black','RGBA')

Out[106]: (0, 0, 0, 255)

ImageColor.getcolor('chocolate','RGBA')

Out[107]: (210, 105, 30, 255)

ImageColor.getcolor('CornflowerBlue','RGBA')

Out[108]: (100, 149, 237, 255)

'''

原点位于图像左上角的像素,用符号(0,0)指定:

x坐标,从原点开始,从左至右增加;

y坐标,从原点开始,从上至下增加;

矩阵元组参数:

左:该矩阵的最左边的x坐标

顶:该矩阵的顶边的y坐标

右:该矩阵的最右下边的x坐标

底:该矩阵的最右下边的y坐标

'''

#################用PIL模块操作图像#################

from PIL import Image

one=Image.open(r'C:\Users\Administrator\Desktop\卡\10056_卡表.jpg')

'''

可以调用Image.open(),传入文件名字符串,对Image对象的所有更改都可以保存到

图像文件中(也是任何格式).所有的旋转、调整大小、裁剪、绘画和其他图像操作

都通过这个Image对象上的方法调用来完成

'''

from PIL import Image

one=Image.open(r'C:\Users\Administrator\Desktop\卡\10056_卡表.jpg')

one.size

wid,hei=one.size

wid

hei

one.filename

one.format

one.format_description

one.save(r'C:\Users\Administrator\Desktop\one.jpg')

'''

Image.new()返回的对象表示空白的图像:

1、字符串'RGBA'

2、大小,两个整数元组,作为新图像的宽度和高度

3、背景颜色:支持传入标准颜色名称的字符串,ImageColor.getcolor()函数的返回值;默认黑色

'''

from PIL import Image

im=Image.new('RGBA',(100,200),'purple')

im.save(r'C:\Users\Administrator\Desktop\im.jpg')

im2=Image.new('RGBA',(20,20))

im2.save(r'C:\Users\Administrator\Desktop\im2.jpg')

##################裁剪图片

############crop函数带的参数为(起始点的横坐标,起始点的纵坐标,终点的横坐标,终点的纵坐标)##############

############crop函数:原始的Image对象原封不动,crop()方法返回一个新的Image对象#########

from PIL import Image

one=Image.open(r'C:\Users\Administrator\Desktop\one.jpg')

cropped=one.crop((200,400,300,500))

cropped.save(r'C:\Users\Administrator\Desktop\cropped.png')

#######################################复制和粘贴图像到其他图像#################################

'''

paste()方法有两个参数:

1、“源”Image对象

2、包含x和y坐标的元组,指明源Image对象粘贴到主Image对象时左上角的位置

'''

from PIL import Image

oneIm=Image.open(r'C:\Users\Administrator\Desktop\one.jpg')

oneCopyIm=oneIm.copy()

faceIm=oneIm.crop((335,345,565,560))

faceIm.size

oneCopyIm.paste(faceIm,(0,0))

oneCopyIm.paste(faceIm,(400,500))

oneCopyIm.save(r'C:\Users\Administrator\Desktop\test.jpg')

#######################################调整图像大小#################################

'''

resize()方法不会在原图上修改Image对象,而是返回一个新的Image对象

'''

from PIL import Image

oneIm=Image.open(r'C:\Users\Administrator\Desktop\one.jpg')

width,height=oneIm.size

quartersizedIm=oneIm.resize((int(width/2),int(height/2)))

quartersizedIm.save(r'C:\Users\Administrator\Desktop\testone.jpg')

svelteIm=oneIm.resize((width,height+300))

svelteIm.save(r'C:\Users\Administrator\Desktop\testtwo.jpg')

#######################################旋转和翻转图像#################################

'''

rotate()方法不会在原图上修改Image对象,而是返回一个新的Image对象

oneIm.rotate(90).save(r'C:\Users\Administrator\Desktop\rotated90.jpg')

oneIm.rotate(180).save(r'C:\Users\Administrator\Desktop\rotated180.jpg')

oneIm.rotate(90).save(r'C:\Users\Administrator\Desktop\rotated270.jpg')

当图像旋转90度或270度时,宽度和高度会变化.如果旋转其他角度,图像的原始尺寸会保持.

rotate()方法有一个可选的expand关键字参数,如果设置为True,就会放大图像的尺寸,

以适应整个旋转后的新图像

'''

oneIm.rotate(6).save(r'C:\Users\Administrator\Desktop\rotated6.jpg')

oneIm.rotate(6,expand=True).save(r'C:\Users\Administrator\Desktop\rotated6_expanded.jpg')

'''

利用transpose()方法,还可以得到图像的"镜像翻转"

必须向transpose()方法传入Image.FLIP_LEFT_RIGHT

或Image.FLIP_TOP_BOTTOM

'''

oneIm.transpose(Image.FLIP_LEFT_RIGHT).save(r'C:\Users\Administrator\Desktop\horizontal_flip.jpg')

oneIm.transpose(Image.FLIP_TOP_BOTTOM).save(r'C:\Users\Administrator\Desktop\vertical_flip.jpg')

#######################################更改单个像素#################################

'''

单个像素的颜色可以通过getpixel()和putpixel()方法设置和取得.

putpixel()方法还接受一个元组,作为该像素的颜色.这个颜色参数是四整数

RGBA元组或三整数RGB元组

'''

from PIL import ImageColor

im=Image.new('RGBA',(100,100))

im.getpixel((0,0))

for x in range(100):

for y in range(50):

im.putpixel((x,y),(210,210,210))

for x in range(100):

for y in range(50,100):

im.putpixel((x,y),ImageColor.getcolor('darkgray','RGBA'))

im.getpixel((0,0))

im.getpixel((0,50))

im.save(r'C:\Users\Administrator\Desktop\putPixel.png')

#######################################在图像上绘画#################################

#####得到一个可以绘制形状和文字的白色图像

from PIL import Image,ImageDraw

im=Image.new('RGBA',(200,200),'while')

draw=ImageDraw.Draw(im)

'''

绘制形状:

point(xy,fill):x,y表示画的点的列表,形式为[(x,y),(x,y)...],fill表示点的颜色,RGBA元组/颜色名称的字符串

line(xy,fill,width):x,y表示绘制的线的一个连接点,形式为[(x,y),(x,y)...],fill表示线的颜色,RGBA元组/颜色名称的字符串,width表示线的宽度

rectangle(xy,fill,outline):x,y参数表示一个矩形元组,形式为[left,top,right,bottom],fill表示颜色,RGBA元组/颜色名称的字符串,outline为可选,矩阵轮廓的颜色

ellipse(xy,fill,outline):x,y参数表示刚好包含该椭圆的矩形,形式为[left,top,right,bottom],fill表示颜色,RGBA元组/颜色名称的字符串,outline为可选,椭圆轮廓的颜色

polygon(xy,fill,outline):x,y参数是一个元组列表,表示多边形边的连接点,形式为[(x,y),(x,y)...],fill表示颜色,RGBA元组/颜色名称的字符串,outline为为可选,多边形轮廓的颜色

http://pillow.readthedocs.org/en/latest/reference/ImageDraw.html

'''

from PIL import Image,ImageDraw

im=Image.new('RGBA',(200,200),'white')

draw=ImageDraw.Draw(im)

draw.rectangle((20,30,60,60),fill='blue')

draw.ellipse((120,30,160,60),fill='red')

draw.polygon(((57,87),(79,62),(94,85),(120,90),(103,113)),fill='brown')

draw.line([(0,0),(100,0),(100,100),(0,100),(0,0)],fill='black')

for i in range(100,200,10):

draw.line([(i,0),(200,i-100)],fill='green')

im.save(r'C:\Users\Administrator\Desktop\drawing.jpg')

#######################################在图像上绘制文本#################################

'''

绘制文本:

text():xy,text,fill,font

xy两个整数的元组,指定文本区域的左上角

text参数想写入的文本字符串

fill可选,文本的颜色

font可选,是一个ImageFont对象,用于设置文本的字体和大小

其中,很难预知一块文本在给定的字体下的大小,textsize()方法,第一参数为测量文本字符串

第二参数为可选的ImageFont对象,返回文本宽度和高度

ImageFont模块,ImageFont.truetype()函数,有两个参数,第一个是字符串,表示字体的TrueType文件,

是硬盘上实际的字体文件,TrueType字体文件具有.TTF文件扩展名;第二个是整数,表示字体大小的

点数(而不是像素).Pillow创建的PNG图像默认是每英寸72像素,一点是1/72英寸

'''

from PIL import Image,ImageDraw,ImageFont

import os

im=Image.new('RGBA',(200,200),'white')

draw=ImageDraw.Draw(im)

draw.text((20,150),'Hello',fill='purple')

fontsFolder='FONT_FOLDER'

arialFont=ImageFont.truetype(os.path.join(fontsFolder,'arial.ttf'),32)

draw.text((100,150),'Howdy',fill='gray',font=arialFont)

im.save(r'C:\Users\Administrator\Desktop\text.png')

'''

小结:

crop()、copy()、paste()、resize()、rotate()、transpose()、save()

'''

python自动化之图像的更多相关文章

  1. 探索微软开源Python自动化神器Playwright

    相信玩过爬虫的朋友都知道selenium,一个自动化测试的神器工具.写个Python自动化脚本解放双手基本上是常规的操作了,爬虫爬不了的,就用自动化测试凑一凑. 虽然selenium有完备的文档,但也 ...

  2. 【玩具】使用Python自动化发送微信消息进行订水

    事情是这样的,我知道淘宝上有卖一种USB接口的大按钮,估计是给工厂或者医院之类的场景设计的,样子长这样: 然后我就一直挺想搞一个的,不为别的,就是玩,但是想来想去也没想到这玩意儿对我而言能有啥用途,就 ...

  3. flow.ci + Github + Slack 一步步搭建 Python 自动化持续集成

    理想的程序员必须懒惰,永远追随自动化法则.Automating shapes smarter future. 在一个 Python 项目的开发过程中可能会做的事情:编译.手动或自动化测试.部署环境配置 ...

  4. Selenium2+python自动化23-富文本(自动发帖)

    前言 富文本编辑框是做web自动化最常见的场景,有很多小伙伴遇到了不知道无从下手,本篇以博客园的编辑器为例,解决如何定位富文本,输入文本内容 一.加载配置 1.打开博客园写随笔,首先需要登录,这里为了 ...

  5. Selenium2+python自动化24-js处理富文本(带iframe)

    前言 上一篇Selenium2+python自动化23-富文本(自动发帖)解决了富文本上iframe问题,其实没什么特别之处,主要是iframe的切换,本篇讲解通过js的方法处理富文本上iframe的 ...

  6. Selenium2+python自动化7-xpath定位

    前言 在上一篇简单的介绍了用工具查看目标元素的xpath地址,工具查看比较死板,不够灵活,有时候直接复制粘贴会定位不到.这个时候就需要自己手动的去写xpath了,这一篇详细讲解xpath的一些语法. ...

  7. Selenium2+python自动化13-Alert

    不是所有的弹出框都叫alert,在使用alert方法前,先要识别出它到底是不是alert.先认清楚alert长什么样子,下次碰到了,就可以用对应方法解决.alert\confirm\prompt弹出框 ...

  8. 【python自动化第十一篇】

    [python自动化第十一篇:] 课程简介 gevent协程 select/poll/epoll/异步IO/事件驱动 RabbitMQ队列 上节课回顾 进程: 进程的诞生时为了处理多任务,资源的隔离, ...

  9. Day1 老男孩python自动化运维课程学习笔记

    2017年1月7日老男孩python自动化运维课程正式开课 第一天学习内容: 上午 1.python语言的基本介绍 python语言是一门解释型的语言,与1989年的圣诞节期间,吉多·范罗苏姆为了在阿 ...

随机推荐

  1. 【RAC搭建报错】You need disks from at least two different failure groups, excluding quorum disks and quorum failure groups, to create a Disk Group with normal redundancy

    报错: You need disks from at least two different failure groups, excluding quorum disks and quorum fai ...

  2. 树莓派 Zero WH 初使用体验

    12号买了一个树莓派 Zero WH,这个是什么型号呢?其实和树莓派Zero是同一系列的,加上W则表示多了无线Wifi和蓝牙模块,加上H则表示在板子上已经焊接好了2x20的排针. 这个Zero真的很迷 ...

  3. 【日常训练】Hockey(CodeForces-96C)

    题意与分析 对于这题题意的理解比较重要,因为这是一条傻逼题: 大小写保持不变 原串中出现的非法字符串里的每一个字符都要替换 Lucky Letter越多越好 这样一种情况下,算法其实特别简单.我傻逼在 ...

  4. hdu1285确定比赛名次(拓扑排序+优先队列)

    传送门 第一道拓扑排序题 每次删除入度为0的点,并输出 这题要求队名小的排前面,所以要用到重载的优先队列 #include<bits/stdc++.h> using namespace s ...

  5. Unity萌新日记—开发小技巧与冷知识(脚本篇)

    在学习unity的过程中,总会遇到很多零碎的知识点和小技巧,在此把它们记录下来,方便日后查看. 第一篇是关于脚本的一些你可能不知道的小知识. 还是个正在学习的萌新,如果写的不好,请谅解. Unity版 ...

  6. 《杜增强讲Unity之Tanks坦克大战》2-场景设置

    2  场景设置 2.1 本节效果预览   2.2 项目目录设置 点击Project面板的Create按钮,在根目录下面新建wm文件夹   Wm文件夹用于存放我们自己生成的Prefab和脚本等其他资源, ...

  7. [egret]白鹭引擎打包安卓包体积太大减小

    萌新第一次用egret打安卓包,发现裸包22M+,吃惊到吃手手. 上网搜查无果. 可能原因是egret优化过一波打包,变得更便利了,网上对新版本打包比较少讨论. 解决方法: egret-android ...

  8. Netty源码分析第6章(解码器)---->第1节: ByteToMessageDecoder

    Netty源码分析第六章: 解码器 概述: 在我们上一个章节遗留过一个问题, 就是如果Server在读取客户端的数据的时候, 如果一次读取不完整, 就触发channelRead事件, 那么Netty是 ...

  9. python 拾遗

    三引号 可以当做多行字符串使用.在类或者方法中用的时候,可以当做docstrings来使用.具体的规则为: 该文档字符串所约定的是一串多行字符串,其中第一行以某一大写字母开始,以句号结束.第二行为空行 ...

  10. Maven打包jar类库

    项目目录>mvn clean compile 编译命令,会在你的项目路径下生成一个target目录,在该目录中包含一个classes文件夹,里面全是生成的class文件及字节码文件. 项目目录& ...