图片处理

补充,关于draw.text 中文字符

怎么找到字体文件,位置:C:\\WINDOWS\\Fonts\\,

找到需要的中文字体,右键-属性 就可以看到字体的文件名,比如,华文行楷 的文件名就是:STXINGKA.TTF

 

from PIL import Image, ImageDraw, ImageFont
im02 = Image.open("images/sushiplate.jpg")
im02 = Image.new('RGB',(1000, 500), 0)
draw = ImageDraw.Draw(im02)
ft = ImageFont.truetype("C:\\WINDOWS\\Fonts\\SIMYOU.TTF", 20)
draw.text((30,30), u"Python图像处理库PIL从入门到精通",font = ft, fill = 'red')
ft = ImageFont.truetype("C:\\WINDOWS\\Fonts\\SIMYOU.TTF", 40)
draw.text((30,100), "Python图像处理库PIL从入门到精通",font = ft, fill = 'green')
ft = ImageFont.truetype("C:\\WINDOWS\\Fonts\\SIMYOU.TTF", 60)
draw.text((30,200), "Python图像处理库PIL从入门到精通",font = ft, fill = 'blue')
ft = ImageFont.truetype("C:\\WINDOWS\\Fonts\\SIMLI.TTF", 40)
draw.text((30,300), "Python图像处理库PIL从入门到精通",font = ft, fill = 'red')
ft = ImageFont.truetype("C:/WINDOWS/Fonts/STXINGKA.TTF", 40)
draw.text((30,400), "Python图像处理库PIL从入门到精通",font = ft, fill = 'yellow')
im02.show()

 

 

一、# pillow模块,我的电脑不需要自己安装呀,如果要安装的话就:pip install pillow # pillow简写:PIL

# pillow模块,我的电脑不需要自己安装呀,如果要安装的话就:pip install pillow
# pillow简写:PIL
import PIL.ImageColor  # 颜色
import PIL.Image  # 图像
import PIL.ImageDraw  # 绘图
import PIL.ImageFont  # 字体
import PIL.ImageFilter  # 滤镜
import PIL.ImageEnhance  # 图像增强
import PIL.ImageSequence  # 处理gif图像
import os
print(PIL.ImageColor.getcolor('red', 'RGBA'))  # 模式可以是RGB(jpg格式) RGBA(png格式) CMYK
# (255, 0, 0, 255)

# 1、 新建图片

img = PIL.Image.new('RGBA', (800, 500), (255, 255, 0, 255))  # 黄色 创建一张图片
img = img.resize((400, 210))  # 改变尺寸,注意:1、将返回一张新的图片,2,传递的参数是一个tuple
img = img.transpose(PIL.Image.FLIP_LEFT_RIGHT)  # 左右翻转
img = img.transpose(PIL.Image.FLIP_TOP_BOTTOM)  # 上下翻转
img = img.rotate(45, expand=False)  # 旋转,将返回一个新的图像, 第二个参数:是否放大图像填充旋转后的空白,png 和jpg效果不一样
img.save('112.png')  # 如果是RGBA模式就要保存为png
print('-------------------------------------')


# 2、 打开现有图片
img = PIL.Image.open('112.png')  # 打开一张照片
print(img)  # <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=1920x1080 at 0x221A64C3670>
print(img.size)  # (1920, 1080)
print(img.width)  # 1920
print(img.height)  # 1080
print(img.filename)  # 001.jpg
print(img.format)  # JPEG
img1 = img.copy()  # 复制
newImg = img.crop((10, 8, 300, 200))  # 裁剪图片
# (100, 80, 300, 200)是一个矩阵,100,80是左上角,300 200 是右下角,(包括左上角的点但是不包括右下角的点)

img.paste(newImg)  # 从左上角这个位置粘贴
img.paste(newImg, (100, 100))  # 从(100,100)这个位置粘贴,第二次粘贴

newImg.save('111.png')  # 保存(另存为)

img.close()  # 关闭文件

# 3、更改单个像素
im = PIL.Image.new('RGBA', (200, 200), (0, 0, 0, 255))  # 黑色不透明
print(im.getpixel((0, 0)))
# (0, 0, 0, 0) 对应R, G, B, A
for x in range(100):
    for y in range(50):
        im.putpixel((x, y), (255, 210, 210, 255))  # 用粉红色填充上半部分

# 4、绘制图形,注意,不像是ps的图层混合模式,每一次绘制都会把下面的图像抹去
draw = PIL.ImageDraw.ImageDraw(im)
#
for y in range(10):
    draw.point((50, y), (255, 0, 0, 255)) # 画10个点
# 线
draw.line(((0, 0), (10, 20), (20, 10)), (255, 255, 255, 255), width=2)
for i in range(100, 200, 10):
    draw.line([(i, 0), (200, i - 100)], fill='green')
# 矩形
draw.rectangle((30, 40, 70, 80), (128, 128, 0, 128), outline=(0, 0, 0, 255), width=2)  # 半透明矩形
# 椭圆(高宽一样就是圆)
draw.ellipse((10, 10, 20, 30), (255, 255, 0, 255))
# 多边形
draw.polygon(((57, 87), (79, 62), (94, 85), (120, 90), (103, 113)), fill='brown')  # 每个坐标都是多边形的角

# 文本
draw.text((20, 150), 'Hello', fill='purple')
fontsFolder = 'FONT_FOLDER'  # e.g. ‘/Library/Fonts’
print(fontsFolder)
arialFont = PIL.ImageFont.truetype(os.path.join(fontsFolder, 'arial.ttf'), 32)
print(arialFont.path)
draw.text((100, 150), 'Howdy', fill='gray', font=arialFont)
# im.save('123.jpg')

im.thumbnail((150, 150))  # 略缩图 注意,这个方法是‘原地操作’,返回值是None,没有返回新的Image
# im.show()
r, g, b, a = im.split()  # 分离通道
# r.show()
im = PIL.Image.merge('RGBA', (r, g, b, a))  # 合并通道,注意,这是一个模块方法,相当于类方法,或静态方法
im = im.convert('RGB')  # 将RGBA 转换成RGB
# im.show()

# 滤镜
im = im.filter(PIL.ImageFilter.BLUR)  # 模糊
# filter方法可以将一些过滤器操作应用于原始图像,比如模糊操作,查找边、角点操作等。filter是过滤器函数,
# 在PIL.ImageFilter函数中定义了大量内置的filter函数,比如BLUR(模糊操作),GaussianBlur(高斯模糊),
# MedianFilter(中值过滤器),FIND_EDGES(查找边)等
# im.show()
# https://www.cnblogs.com/Young-shi/p/11478732.html

# 图像增强
im = PIL.Image.open('001.jpg')  # 打开一张照片
brightness = PIL.ImageEnhance.Brightness(im)
# brightness = PIL.ImageEnhance.Brightness(im)
im_brightness = brightness.enhance(1.5)
im_brightness.show()  # 图像变亮了
im_contrast = PIL.ImageEnhance.Contrast(im)
im_contrast.enhance(1.5)
# <PIL.Image.Image image mode=RGB size=296x299 at 0x7F62AE271AC8>
im_contrast.enhance(2.5).show()  # 增加饱合度

# 处理gif图像的每一帧
# 下面的代码可以遍历gif图像中的所有帧,并分别保存为图像
gif = PIL.Image.open("pipixia.gif")
for i, frame in enumerate(PIL.ImageSequence.Iterator(gif),1):
    # enumerate:对迭代器进行包装,可以返回索引和值。参数1表示并非从0开始,而是从1开始
    if frame.mode == 'JPEG':
        frame.save("%d.jpg" %i)
    else:
        frame.save("%d.png" % i)
# 除了上面使用迭代器的方式以外,还可以一帧一帧读取gif,比如下面的代码:
index = 0
while 1:
    try:
        gif.seek(index)
        gif.save("%d.%s" %(index,'jpg' if gif.mode == 'JPEG' else 'png'))
        index += 1
    except EOFError:
        print("Reach the end of gif sequence!")
        break

# 上面的代码在读取到gif的最后一帧之后,会throw 一个 EOFError,所以我们只要捕获这个异常就可以了。

 

posted @ 2020-11-02 16:50  老谭爱blog  阅读(102)  评论(0)    收藏  举报