python进阶宝典18- 使用Pillow模块操作图像

一  颜色与RGBA简述

二  图像基本操作

(打开、保存、创建、复制、裁剪、粘贴、平铺、调整大小、旋转、翻转、获取及修改像素。。。)

三  综合例子:为许多图像的右下角添加徽标

四  ImageDraw 绘图与绘制文本

具体说明及注释见代码,如下:

## 使用Pillow模块操作图像
## 1.颜色与RGBA
#  计算机程序通常将图像的颜色表示为RGBA值,这是一组数字,表示指定颜色中的红、绿、蓝(加色模型)和alpha(透明度)的值,从0~255。
#  这些RGBA值分配给单个像素,如(255,0,0,255)表示完全不透明的纯红色
#  另:颜料混合用的是减色模型,混合红、黄、蓝三种颜色可以得到其他颜色,是不同的。
#  2.屏幕原点(0,0)为左上角
# pip install pillow
from PIL import ImageColor
ImageColor.getcolor('red','RGBA')            # 转换颜色为RGBA元组
ImageColor.getcolor('chocolate','RGBA')
# Image基本操作
from PIL import Image
catIm = Image.open('zophie.png')             # 打开图片
print(catIm.filename,'---',catIm.size)       # 显示图片文件名,大小像素
print(catIm.format,'---',catIm.format_description) # 显示图片格式名,格式说明
width,height = catIm.size
print(width,height)
catIm.save('zophie.jpg')                     # 保存图片到文件
im = Image.new('RGBA',(100,200),'purple')    # 创建颜色像素背景
im.save('output.png')
im = Image.new('RGBA',(20,20))               # 创建透明背景,不指定颜色即为透明
im.save('output.png')
# 图片复制、裁剪、粘贴
catCopyIm = catIm.copy()                     # 复制图片
faceIm = catIm.crop((335,345,565,560))       # 裁剪图片,矩形区域四个数字分别是左上右下
print(faceIm.size)
catCopyIm.paste(faceIm,(0,0))                # 将faceIM粘贴到catCopoyIM上原点处,直接在原图粘贴
catCopyIm.paste(faceIm,(400,500))
catCopyIm.paste(faceIm,(400,500),faceIm)     # 第三个参数可使paste()方法不会粘贴透明的像素,特别贴logo时
catCopyIm.save('output.png')                 # 保存修改后的图像
# 使用faceIm平铺catIm整个图像
catImWidth,catImHeigh = catIm.size
faceImWidth,faceImHeigh = faceIm.size
catCopyTwo = catIm.copy()
for left in range(0,catImWidth,faceImWidth):   # 横纵两个方向上用两个for循环实现平铺效果
    for top in range(0,catImHeigh,faceImHeigh):
        print(left,top)
        catCopyTwo.paste(faceIm,(left,top))
catCopyTwo.save('output.png')
# 调整图像大小
SmallIm = catIm.resize((int(catImWidth / 2),int(catImHeigh / 2)))
SmallIm.save('output.png')
LongIm = catIm.resize((catImWidth,catImHeigh + 300))
LongIm.save('output.png')
# 旋转、翻转图像
catIm.rotate(90).save('output.png')     # 图像逆时针旋转90度
catIm.rotate(180).save('output.png')
catIm.rotate(270).save('output.png')
catIm.rotate(6).save('output.png')      # 小角度旋转,缝隙背景色填补
catIm.rotate(6,expand=True).save('output.png')   # 小角度旋转,自适应放大图像
catIm.transpose(Image.FLIP_LEFT_RIGHT).save('output.png')    # 水平镜像翻转
catIm.transpose(Image.FLIP_TOP_BOTTOM).save('output.png')    # 垂直镜像翻转
catIm.close()                           # 关闭打开的图片
# 获取、更改单个像素 (gepixel()、putpixel())
from PIL import Image
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))         # 设置单个像素
from PIL import ImageColor
for x in range(100):
    for y in range(50,100):
        im.putpixel((x,y),ImageColor.getcolor('darkgray','RGBA'))
print(im.getpixel((0,0)),  im.getpixel((0,50))  )
im.save('output.png')

## 项目:为许多图像的右下角添加徽标
# 1.载入徽标图像
# 2.循环遍历工作目录中所有.png,.jpg文件
# 3.调整图片,检查宽和高是否大于300像素,如是,将大者减小为300,小者按比例缩小
# 4.粘贴徽标,并将改变的图像保存到另一文件夹
# Resizes all images in current working directory to fit in a 300*300 square,
# and adds catlogo.png to the lower-right corner.
import os
from PIL import Image
SQUARE_FIT_SIZE = 300
LOGO_FILENAME = 'catlogo.png'
logoIm = Image.open(LOGO_FILENAME)
logoWidth,logoHeight = logoIm.size
# 按比例缩小徽标到100像素以内,避免徽标太大,超出底图
logoIm = logoIm.resize(( int(logoWidth*100/(logoWidth+logoHeight)), int(logoHeight*100/(logoWidth+logoHeight))   ))
logoWidth,logoHeight = logoIm.size
os.makedirs('withLogo',exist_ok=True)
# Loop over all files in the working directory.
for filename in os.listdir('.'):
    if not (filename.endswith('.png') or filename.endswith('.jpg')) \
       or filename ==LOGO_FILENAME:
       continue       # skip non-image files and the logo file itself
    im = Image.open(filename)
    width,height = im.size
    # Check if image needs to be resized.
    if width > SQUARE_FIT_SIZE or height > SQUARE_FIT_SIZE:
        # Calculate the new width and height to rezise to.
        if width > height:
            height = int((SQUARE_FIT_SIZE/width)*height)
            width = SQUARE_FIT_SIZE
        else:
            width = int((SQUARE_FIT_SIZE/height)*width)
            height = SQUARE_FIT_SIZE
        # Resize the image.
        print('Resizing %s...' % (filename))
        im = im.resize((width,height))
    # Add the logo.
    print('Adding logo to %s...' % (filename))
    # 这里如果没有传入第三个参数logoIm,paste()方法不会粘贴透明的像素
    im.paste(logoIm,(width-logoWidth,height-logoHeight),logoIm)   
    #Save changes.
    im.save(os.path.join('withLogo',filename))

## ImageDraw 绘图
from PIL import Image,ImageDraw
im = Image.new('RGBA',(200,200),'white')    # 创建Image对象
draw = ImageDraw.Draw(im)                   # 保存ImageDraw对象,即可调用各种绘图方法
draw.line([(0,0),(0,199),(199,199),(199,0),(0,0)],fill='black')      # 画线
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')  # 画多边形
# 循环绘制效果
for i in range(100,200,5):
    draw.line([(i,0),(200,i-100)],fill='green')
im.save('output.png')

## 绘制文本 ,可用ImageFont设置字体
from PIL import Image,ImageDraw,ImageFont
import os
im = Image.new('RGBA',(500,500),'white')    
draw = ImageDraw.Draw(im)
draw.text((20,150),'Hello',fill='purple')            # 绘制文本
fontsFolder = 'C:\\Windows\\Fonts\\'
myFont = ImageFont.truetype(os.path.join(fontsFolder,'SHOWG.TTF'),32)
# 上面两句和下面这句效果一样
# myFont = ImageFont.truetype('C:\\Windows\\Fonts\\SHOWG.TTF',32)   # 设置字体
myText = 'I love python'
draw.text((50,50),myText,fill='gray',font=myFont)    # 绘制文本,使用特定字体
im.save('output.png')

猜你喜欢

转载自blog.csdn.net/ebzxw/article/details/80723348
今日推荐