Pillow库中最重要的类就是Image,该类存在于同名的模块中。可以通过以下几种方式实例化:从文件中读取图片,处理其他图片得到,或者直接创建一个图片
1、使用image打开一张图片并显示标准版本的show()方法不是很有效率,因为它先将图像保存为一个临时文件,然后使用xv进行显示。如果没有安装xv,该函数甚至不能工作。但是该方法非常便于debug和test。(windows中应该调用默认图片查看器打开)
1)、使用Image模块中的open函数打开一张图片,并利用show函数显示这张图片,python代码如下:
#打开图片
from PIL import Image
im = Image.open("D://myself1.jpg")
print(im.format, im.size, im.mode)
im.show()
2)、python代码运行的结果如下:
终端显示图片的属性:Pillow库支持相当多的图片格式。直接使用Image模块中的open()函数读取图片,而不必先处理图片的格式,Pillow库自动根据文件决定格式。
Image模块中的save()函数可以保存图片,除非你指定文件格式,那么文件名中的扩展名用来指定文件格式。
1)、利用Image模块中的save函数,将图片另存为jpg格式的图片
#另存为jpg图片
from PIL import Image
im = Image.open("D://myself1.jpg")
im.save("D://myself2.jpg")
im1 = Image.open("D://myself2.jpg")
print(im.format, im.size, im.mode)
im1.show()
运行结果如下所示:
在D盘的环境下找到生成的图片:
2)、利用Image模块中的save函数,将图片另存为png格式的图片
#另存为png图片
from PIL import Image
im = Image.open("D://myself1.jpg")
im.save("D://myself3.png")
im1 = Image.open("D://myself3.png")
print(im.format, im.size, im.mode)
im1.show()
运行结果如下所示:
在D盘的相应位置,可以发现该图片,存的图片尺寸变大了哦!
#图片装换为jpg格式
from PIL import Image
def IsValidImage(img_path):#判断文件路径是否有效
bValid = True
try:
Image.open(img_path).verify()
except:
bValid = False
return bValid
def transimg(path,img_path):#转换
if IsValidImage(path):
try:
str = img_path.rsplit(".", 1)
output_img_path = str[0] + ".jpg"
print(output_img_path)
im = Image.open(path)
path1="D://"+output_img_path
im.save(path1)
return True
except:
return False
else:
return False
if __name__ == '__main__':
path = "D://"+img_path
img_path="myself3.png"
print(transimg(path,img_path))
2、运行结果如下:
#缩略图
import os
import glob
from PIL import Image
def thumbnail_pic(path):
a=glob.glob(r'D://myself4.png')
for x in a:
name=os.path.join(path,x)
im=Image.open(name)
im.thumbnail((80,80))
print(im.format,im.size,im.mode)
im.save(name,'JPEG')
print('完成压缩!')
if __name__=='__main__':
path='.'
thumbnail_pic(path)
必须指出的是除非必须,Pillow不会解码或raster数据。当你打开一个文件,Pillow通过文件头确定文件格式,大小,mode等数据,余下数据直到需要时才处理。这意味着打开文件非常快,与文件大小和压缩格式无关。
2、运行结果如下所示:1)、终端提示压缩完成
2)、打开对应位置的图片,如下所示:
#确定图片属性
import os
import glob
from PIL import Image
def shuxing(path):
a=glob.glob(r'D://myself3.jpg')
for x in a:
name=os.path.join(path,x)
im=Image.open(name)
print(im.format,im.size,im.mode)
if __name__=='__main__':
path='.'
shuxing(path)
2、运行结果
五、裁剪、粘贴、与合并图片
1、从图片中复制子图像
1)、复制子图像的python代码如下所示:
#从图片中复制子图像
from PIL import Image
im = Image.open("D://myself3.png")
box = im.copy() #直接复制图像
box = (100, 100, 400, 400)
region = im.crop(box)
region.show()
2)、运行结果如下所示:
box = (100, 100, 400, 400) 信息代表(left, upper, right, lower)。 Pillow左边系统的原点(0,0)为图片的左上角。坐标中的数字单位为像素点,所以上例中截取的图片大小为300*300像素^2。原图课参考上面的图像哦!
2、处理子图,粘贴回原图1)、粘贴回原图的python代码如下所示:
#处理子图像,粘贴回原图
from PIL import Image
im = Image.open("D://myself3.png")
box = im.copy() #直接复制图像
box = (100, 100, 400, 400)
region = im.crop(box)
region = region.transpose(Image.ROTATE_90)#旋转90度
im.paste(region,box)
im.show()
将子图paste回原图时,子图的region必须和给定box的region吻合。该region不能超过原图。而原图和region的mode不需要匹配,Pillow会自动处理。
另一个例子
2)、运行结果
1)、分离合并并通道的python代码如下所示:
#分离和合并通道
from PIL import Image
im = Image.open("D://myself3.png")
r, g, b = im.split()
im = Image.merge("RGB", (b, g, r))
im.show()
对于单通道图片,split()返回图像本身。为了处理单通道图片,必须先将图片转成RGB
2)、运行结果如下所示:
1)、代码如下:
#简单的几何变换
from PIL import Image
im = Image.open("D://myself3.png")
out = im.resize((128, 128))
out = im.rotate(45) # 顺时针角度表示
out.show()
2)、运行结果如下所示:
1)、置换图像代码如下所示:
#置换图像
from PIL import Image
im = Image.open("D://myself3.png")
#out = im.transpose(Image.FLIP_LEFT_RIGHT)
#out = im.transpose(Image.FLIP_TOP_BOTTOM) #颠倒
#out = im.transpose(Image.ROTATE_90)#向左旋转90度
out = im.transpose(Image.ROTATE_180)#向左旋转180度
#out = im.transpose(Image.ROTATE_270)#向左旋转270度
out.show()
大家可以去掉注释依次进行实现!
transpose()和rotate()没有性能差别。 通用的图像变换方法可以使用transform()
2)、运行结果如下所示:
1)、模式转换代码如下:
#模式转换
from PIL import Image
im = Image.open('D://myself3.png').convert('L')
im.show()
2)、运行结果如下所示:
ImageFilter模块包含很多预定义的增强filters,通过filter()方法使用
1、Filter的图像增强1)、增强图像的代码如下所示:
#图像增强
from PIL import ImageFilter
im = Image.open('D://myself3.png')
out = im.filter(ImageFilter.DETAIL)
out.show()
2)、运行的后与原图的对比结果如下所示:
1)、像素点处理的代码如下所示:
#像素点处理
# multiply each pixel by 1.2
from PIL import ImageFilter
im = Image.open('D://myself3.png')
out = im.point(lambda i: i * 1.2)
out.show()
point()方法通过一个函数或者查询表对图像中的像素点进行处理(例如对比度操作)
上述方法可以利用简单的表达式进行图像处理,通过组合point()和paste()还能选择性地处理图片的某一区域。
2)、运行的后与原图的对比结果如下所示:
1)、高级图片增强的代码如下:
#高级图像增强
from PIL import ImageEnhance
im = Image.open('D://myself3.png')
enh = ImageEnhance.Contrast(im)
enh.enhance(1.3).show("30% more contrast")
对其他高级图片增强,应该使用ImageEnhance模块 。一旦有一个Image对象,应用ImageEnhance对象就能快速地进行设置。 可以使用以下方法调整对比度、亮度、色平衡和锐利度。
2)、运行的后与原图的对比结果如下所示:
之前说到Image模块的open()函数已经足够日常使用。该函数的参数也可以是一个文件对象。这里介绍三种其他方法。
1、通过string中读取1)、通过string流读取的图像数据代码如下:
#从string中读取图片
import StringIO
im = Image.open(StringIO.StringIO('D://myself3.png'))
im.show()
2)、读取的结果如下所示:
1)、tar文件读取图像代码:
#从tar文件中读取
from PIL import TarIO
fp = TarIO.TarIO("D://Imaging.tar", "Imaging/myself3.png")
im = Image.open(fp)
im.show()
2)、读取的结果:
1)、代码如下:
#draft模式
from PIL import Image
im = Image.open('D://myself3.png')
print("original =", im.mode, im.size)
im.draft("L", (100, 100))
print("draft =", im.mode, im.size)
im.show()
2)、运行结果如下:
以上就是本次博客的全部内容了啊,希望对小伙伴理解python的基础图像处理库Pillow有用哦!遇到问题的小伙伴记得评论区留言哦,林君学长看到会给大家解答的,这个学长不太冷!
陈一月的又一天编程岁月^ _ ^