Image模块
Image模块是在Python PIL图像处理中常见的模块,对图像进行基础操作的功能基本都包含于此模块内。如 open 、 save 、 conver 、 show …等功能。
open类
Image.open(file) ⇒ image
Image.open(file, mode) ⇒ image
要从文件加载图像,使用 open() 函数, 在 Image 模块:
from PIL import Image # 调用库
im = Image.open("a.jpg") # 文件存在的路径
im.show()
Save类
im.save(outfile,options…)
im.save(outfile, format, options…)
若要保存文件,则使用 Image 类的 save() 方法,此时保存文件的文件名就变得十分重要了,除非指定格式,否则这个库将会 以文件名的扩展名作为格式保存 。
from PIL import Image # 调用库
im = Image.open("a.jpg")
print(im)
im.save("a_save.png") # 将"a.jpg"保存为"a_save.png"
im = Image.open("a_save.png") # 打开新的png图片
# 输出图片格式、尺寸、模式
print(im.format, im.size, im.mode)
运行结果如下:
format类
im.format ⇒ string or None
这个属性标识了图像来源,如果图像不是从文件读取它的值就是None。
from PIL import Image # 调用库
im = Image.open("a.jpg")
print(im.format) # 打印出格式信息
运行结果:如下图可以看到其format为”JPEG”。
Mode类
im.mode ⇒ string
图像的模式,常见的mode 有 “L” (luminance) 表示灰度图像,“RGB”表示真彩色图像,和 “CMYK” 表示出版图像,表明图像所使用像素格式。如下表为常见的modes描述:
modes |
描述 |
1 |
1位像素,黑和白,存成8位的像素 |
L |
8位像素,黑白 |
P |
8位像素,使用调色板映射到任何其他模式 |
RGB |
3× 8位像素,真彩 |
RGBA |
4×8位像素,真彩+透明通道 |
CMYK |
4×8位像素,颜色隔离 |
YCbCr |
3×8位像素,彩色视频格式 |
I |
32位整型像素 |
F |
32位浮点型像素 |
from PIL import Image # 调用库
im = Image.open("a.jpg")
print(im.mode) # 打印出模式信息
运行结果:如下图,图片的 mode 为“RGB”模式。
convert类
im.convert(mode)⇒ image
将当前图像转换为其他模式,并且返回新的图像。当从一个调色板图像转换时,这个方法通过这个调色板来转换像素。如果不对变量mode赋值,该方法将会选择一种模式,在没有调色板的情况下,使得图像和调色板中的所有信息都可以被表示出来。
from PIL import Image # 调用库
im = Image.open("a.jpg")
# 将图像转换为“P”模式。
new_im = im.convert('P')
print(new_im.mode)
# P 模式的图像不能保存为 .jpg 格式
new_im.save("a_P.png")
运行结果:将图像转换为“P”模式。
对比原始图像:
原图 | “P”模式 |
Size类
im.size ⇒ (width, height)
图像的尺寸,按照像素数计算,它的返回值为宽度和高度的二元组(width, height)。
from PIL import Image # 调用库
im = Image.open("a.jpg")
print(im.size) # 打印出尺寸信息
运行结果:图片的尺寸信息,200*201。
Palette类
im.palette ⇒ palette or None
颜色调色板表格。如果图像的模式是“P”,则返回ImagePalette类的实例;否则,将为None。
from PIL import Image # 调用库
im = Image.open("a.jpg")
print(im.palette)
im = Image.open("a_P.png")
print(im.palette)
运行结果:
Info类
im.info ⇒ dictionary
存储图像相关数据的字典。
from PIL import Image
im = Image.open("a.jpg")
print(im.info)
运行效果:
{'jfif': 258, 'jfif_version': (1, 2), 'dpi': (72, 72), 'jfif_unit': 1, 'jfif_density': (72, 72), 'exif': b'Exif\x00\x00II*\x00\x08\x00\x00\x00\x07\x00\x12\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\x1a\x01\x05\x00\x01\x00\x00\x00b\x00\x00\x00\x1b\x01\x05\x00\x01\x00\x00\x00j\x00\x00\x00(\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x001\x01\x02\x00\x1c\x00\x00\x00r\x00\x00\x002\x01\x02\x00\x14\x00\x00\x00\x8e\x00\x00\x00i\x87\x04\x00\x01\x00\x00\x00\xa4\x00\x00\x00\xd0\x00\x00\x00\x80\xfc\n\x00\x10\'\x00\x00\x80\xfc\n\x00\x10\'\x00\x00Adobe Photoshop CS3 Windows\x002011:11:19 22:16:41\x00\x00\x00\x03\x00\x01\xa0\x03\x00\x01\x00\x00\x00\xff\xff\x00\x00\x02\xa0\x04\x00\x01\x00\x00\x00\xc8\x00\x00\x00\x03\xa0\x04\x00\x01\x00\x00\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x03\x01\x03\x00\x01\x00\x00\x00\x06\x00\x00\x00\x1a\x01\x05\x00\x01\x00\x00\x00\x1e\x01\x00\x00\x1b\x01\x05\x00\x01\x00\x00\x00&\x01\x00\x00(\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x02\x04\x00\x01\x00\x00\x00.\x01\x00\x00\x02\x02\x04\x00\x01\x00\x00\x00\x03\x14\x00\x00\x00\x00\x00\x00H\x00\x00\x00\x01\x00\x00\x00H\x00\x00\x00\x01\x00\x00\x00\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x02\x00\x00H\x00H\x00\x00\xff\xed\x00\x0cAdobe_CM\x00\x02\xff\xee\x00\x0eAdobe\x00d\x80\x00\x00\x00\x01\xff\xdb\x00\x84\x00\x0c\x08\x08\x08\t\x08\x0c\t\t\x0c\x11\x0b\n\x0b\x11\x15\x0f\x0c\x0c\x0f\x15\x18\x13\x13\x15\x13\x13\x18\x11\x0c\x0c\x0c\x0c\x0c\x0c\x11\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x01\r\x0b\x0b\r\x0e\r\x10\x0e\x0e\x10\x14\x0e\x0e\x0e\x14\x14\x0e\x0e\x0e\x0e\x14\x11\x0c\x0c\x0c\x0c\x0c\x11\x11\x0c\x0c\x0c\x0c\x0c\x0c\x11\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xff\xc0\x00\x11\x08\x00\xa0\x00\x9f\x03\x01"\x00\x02\x11\x01\x03\x11\x01\xff\xdd\x00\x04\x00\n\xff\xc4\x01?\x00\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x01\x02\x04\x05\x06\x07\x08\t\n\x0b\x01\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x10\x00\x01\x04\x01\x03\x02\x04\x02\x05\x07\x06\x08\x05\x03\x0c3\x01\x00\x02\x11\x03\x04!\x121\x05AQa\x13"q\x812\x06\x14\x91\xa1\xb1B#$\x15R\xc1b34r\x82\xd1C\x07%\x92S\xf0\xe1\xf1cs5\x16\xa2\xb2\x83&D\x93TdE\xc2\xa3t6\x17\xd2U\xe2e\xf2\xb3\x84\xc3\xd3u\xe3\xf3F\'\x94\xa4\x85\xb4\x95\xc4\xd4\xe4\xf4\xa5\xb5\xc5\xd5\xe5\xf5Vfv\x86\x96\xa6\xb6\xc6\xd6\xe6\xf67GWgw\x87\x97\xa7\xb7\xc7\xd7\xe7\xf7\x11\x00\x02\x02\x01\x02\x04\x04\x03\x04\x05\x06\x07\x07\x06\x055\x01\x00\x02\x11\x03!1\x12\x04AQaq"\x13\x052\x81\x91\x14\xa1\xb1B#\xc1R\xd1\xf03$b\xe1r\x82\x92CS\x15cs4\xf1%\x06\x16\xa2\xb2\x83\x07&5\xc2\xd2D\x93T\xa3\x17dEU6te\xe2\xf2\xb3\x84\xc3\xd3u\xe3\xf3F\x94\xa4\x85\xb4\x95\xc4\xd4\xe4\xf4\xa5\xb5\xc5\xd5\xe5\xf5Vfv\x86\x96\xa6\xb6\xc6\xd6\xe6\xf6\'7GWgw\x87\x97\xa7\xb7\xc7\xff\xda\x00\x0c\x03\x01\x00\x02\x11\x03\x11\x00?\x00\xea\xb6\xe8\x9bj.\xd4\xc5\xaaD!-Q-G-Q-EH\x0bS\x16\xa3\x16\xa8\xedAH\xa0\xa1\xdbet\xd6\xebmpk\x18\ts\x8f\x829\x10\xb9\xee\xb7\x96r,\xfb;\'\xd1\xa8\xcb\x80\xfc\xe7\x0f\xfc\x82 YA->\xa3\xd4\xee\xcdqeN4\xd3\xc6\xd9\x82\xf0?~?\xea\x11\xbav+h\xa8\xde\xed^\x07\xb4N\x91\xe7*\xa5,\x05\xe0v\xfd\xd0?\xef\xcbhT\xe3@\xa9\x83\xdaZDy\x9f\x15!"!\x02$\x97\x04\x92\xfb\xdc\xe7\xcb\xc9&]2U\xdcj\x85\x80\xb5\xdd\xa0\xc8\xd0\x8f\xe5\x7fUF\xdc;j\xb0\x974\xc73\x1a\xca\xbd\x8dN\xe6\x87\xb7\xda\xe6\xea\x1c\xddc\xf7\xa3\xf7\xab\xff\x00KW\xe6\'\x89\x03\xb2%\x12\x13\xd2\xd2?Cp\x07t\x16\x9e\x03\x88\xf7\xb7w\xeeY\xfb\x8f]65\xb5\xdfE7\x00\ta-3\xcb\\t?\xf4V\x0b\x18\x1f^\xba\x0e\xde \x8f\xfc\x8b\xbf\xe8+\x18\xd7\xbd\x80\xba~\x97\xb6\xd6\xf9\x83\xecw\xf5\x90\x9cx\x82\xc1*/@\x92@\xc8\x07\xc7_\xbd%Y\x99I$\x92JRI$\x92\x9f\xff\xd0\xed\x0b\x14KG\x88V\x0b\x14\x08R\xa1\xae@\xf1\xfc\nh\x1eg\xe0\x11\xc8M\xb5\x05 \xdb\xfc\x97~\x03\xf8\xa8\x96\x9f\xdd?7\x05gjE\x89)\xcb\xea\x16\xba\x8cr\xe0\xd0\x1c\xe3\xb5\x9e\xe9\xd4\xf7\xfa+\x97\xb4=\xf6\n\x9a7\x19\x80?\x8a\xe9\xba\xc8;\xabg`\x0b\x8f\xfdHY=2\x8d\xf9F\xc7k\x07D\xf1\xa4IZ\x05\xc8\x07C\xa7tj\xeb`u\xbe\xe7w\xec\x07\xc9j\x0cz\xc0\x80!J\xa8\xda\x11;(I$\xd9lm\xa0\xd1\xcd\xce\xc3c\xd8t\xf8\xacZ\xac~\x1e@\x0e\xd6\xb7\x18x\xff\x00\xd1\x8d\xfe[\x17Qh\x05\xab\x0b\xa8\xe3\xb7\x9e<\xd3\xf1\xca\x8d-\x98\xe2\x1e!\xb6\xc0\xd2%\xba\xb5\xc0\x11\x1cx\x04\x99\x1e\xa1i\xe1\xc3\xf1\x1f\xf9\x8a\xa7\xd2\xb2=\x86\x97\xfd*\xf5\x1em?\xf9\x15j\xe3\xe9\xde\xc7v<\x9f\x8e\x8a\xc0j\xc8;]>\xefR\x8d\x8e>\xfa\xb4>m\xfc\xc7+K\x1b\x16\xff\x00C%\xa4\xfd\x17{\\\x16\xca\x83$h\xf9\xb2@\xd8\xf2RI*\x96eYk\xcd\x18@=\xe3\xe9\xdc~\x83?\xf2NM\x00\x94\x93M\xb4\x92\xd65\xe5$\x92\xff\x00\xff\xd1\xef\x8a\x89l\xa9$\x9e\x86\x1e\x9a^\x9aN\xba\xb6\xe8O\xdd\xaa\x8f\xdaj\xf3\xfb\x91\xd5V\xcc0%\xb0!\xfd\xa5\xbf\xbaR\xfbK\x07b\x85\x15[\x97\xd6Y\xfac\xdf\xd8!g\xf4\xc6\x89>j\xff\x00Q\xb8X\xe7\xd84\x11\x1fr\xca\xc7~H;1\xe1\xbe.*B=\x14\x88\x9f]\xbb\xf5\xa2\xca\xc7\xad\x99\xf3\xb9\xf9;\x80\xd4\xb5\xb1\x10\xb4i~\xf6jd\x8d\n\x87\xf1g\xd6\xadl\x8c\x9a+o\xe9,\x0c\x1e$\xac|\xcc\xfc\'\x82\x1b`q\xf2Wrh\xa8\xbc\x97\x8f3=\x96.OQ\xe9-\x0e\xda\xc2\xf6\x87m6\x06\xfbw~\xee\xef\xdeF\x1a\x9d\x89\xf2Q\x04\r\xc0\xf3G\x8f\x92\xca\xf3+{L\xb4\x9d\xae\x1eNZ\xd9\x07v/\xa8>\x95:;\xe1+\x02\xdbq\x9e\xc3m\x03\x83\xcf\xfeIl\xf4\xfc\x91sv\xbfV\xda\xd2\xd7|U\x91\xb0kd\x1a\xb6\xad~\x8dw\xf2\x84\x1f\xeb\x0f\xfc\x93V\xd6&Uo\xc3\x17\xd8\xe0\xc6\xd6"\xc78\xc0\x10\xb0^\xd2+5w\x0c\x1bO\x9b~\x8a\xb1\xd2_U\x975\x977p\x07sZ\xee7\xfek\x8b\x7fy\t\x8b\x8f\x92\xd8\x9a>n\xa1\x17f\x8dwQ\x8ax\x1cY`\xff\x00\xd1U\xa2\x06\xb2\xb6\x06T6\xb5\xbc\x01\xa7\xcd\x1dW.\xf1*\x1b\xbf&C\xa2\xfb\xc8\xe5-\xe7\xb7\xcdD\x193\xcc%1\xa7\x12\x8d"\xdf\xff\xd2\xef\x90\xaf|\x00\xdf\x99Sm\x8cw\x0ei\xf8\x10\xab\\\xf0\xe7\x13\xe7\xfe\xc4\xf0\x86\x05\xd2\xa3\xf0N\x94\x8f\x04mT\xa8*6\x12\xd6\x17x\tD\x9d~\x7f\xc1U\xeaV\xfax\x8e=\xdd\r\x1f4\x016\x02hU\xb4\x1df\xf68~\xf4\x81\xf7,\xb6\xb6\xfb\xa8-\xa4\xedp$8\xf8\tG\xaa\xe9%\xbez)\xe39\xb4\xe6:tm\xd0\xe1\xf1\xe1\xc1I#@\xd2\xdcb\xe4\x07u\x99\xd1\xec6\xb6\xcc|\x87R\xdfi.$\x97\x877\xe9G\xe6\xfb\xd6\xce#^\xdbv\xbb\x92$\xc7\x13\xc6\x88\x955\xb1!K\x1f\xdd{\xbcF\x8a\x03"j\xdb\x14\x004\xd6\xcf\xc671\xec\x92\x03\xb41\xccx,\xab\xbaMV\\\xec\x87\x02\x1eHp\x00Cw4\x00\x1d\xb0\x7fQt7\xe9?\x8a\xac\xf09HH\x8d\x8aE\x11\xa8yl\xdc\x1a\xf1\xaa\xb2\xd0!\xc7W\x1f\x12J\x16\x16K\x98\x00i\xd7\xb7\xc4+\xff\x00X\x1c\x1b\x8b`\xf2\x1f\x94,\n.\xda\xf6\xeb\x1c\x99\xf9+\x18I17\xae\xac9\xa2\x04\x87\x88z\xd6\xe46\xfa\xab\xbe\xbdC\xa0\x1f\x99\n\x14[\xe9\xdc\x1c\xd3\x1a\xf3\xe64Y\x1d\x1f7v\xeaN\x93\xabG\x81\xee\xafX\xe0\xcc\x972}\xaf\xda\xe6\x9f\x88\xf7\x85\'\x83\\\x87\xb0\xc7\xc8e\xd46\xd1\xa4\xe8\xe1\xe0T\x8d\x8dX}/.\x0e\xd7\x1fk\xf4\x7f\xc4p\xe5\xa2\xf7\x92\x08\xee\xa0\x94h\xb2\th\xd8\xf5|@\xf2M\xae\xe9\xd3\x95V\xb6\xb6w\x1dOb\x8d:B\x04R\xe7\xff\xd3\xeb1\xf1\xea\xb4\xb8Xa\xed?DG\x1f\xbc\xa5&G\xc9e\xbbB7eR \x8d;\xad3\xcc\xfc\x14\xb2>(\x1bl\xbc\xa6\x94\xa53\xbf\xbd7\x88*\x8a\xf2\xb2z\xe6G\xe9j\xa0\x1d\x1a\xd3c\xbf#\x16\xac\xf7\xec5\\\x97Q\xcc\xf5r-\xb6~\x99 \x0f\x06\xb3\xf4M\xff\x00\xa7\xbd\x18j|\x96\x968\xf6\x99\xdd\xe0b~\xe5r\xd7\x82\xc7\x16\ts%\xe0~$\x7f\x9a\xb2\xb0\xeequ\x8d\'\xdaLGiF\xaf42\xca\xdc\xe3\xcc\x03\xf2\xf6\x15!E\xd3\xd2\xf4\xec\xb1m-\xd6L"W\x92\xfa\xaf \xb3t\xf7\x0b\x9f\xe9\xb9b\x9b=\x19\x86\x87\xb9\x8c\xf9{\x9b\xff\x00Ai[\x9b\x95U\xc3\xd2\xa5\xaf\x9f\xa0K\x80\x04\xf9\xaa\xd2\x1c2#\xecnc\xfd`\x07\xbb\xa8\xebr\xadq\xfd\x1bYQ\x1a\x12}\xf3\xe6>\x8a\x15\xa44*\xce\xce\xea1\xad5V\xc3\xa0\x0ey.\x93\xe0\xd653\xac\xb4V]qn\xeeN\xd9\x8f\x87\xb94\x95\xdc\x12\x89\xd6\xbe\x86\xdc\x0f\xac\xf90\xcd\x80\xe8H\x95\x83~\xeamkg\xc6\n\xb3\xd5rFWPe \xcbw\xea{r\x85\xd7F\xcb\xeb1\x01\xcd?\x81V\xb0\xe9\x01\xe3\xab[9\xb9\xf9\ne\xd2\xf2#\xa8\xd5\x1c9\xe1\xb1\xf1\xd1o\xe7\xb9\xde\x8dv\xb7\x96\xc8w\x9f\xee\xff\x00\x9a\xb9~\x8a\x0b\xfa\x95\x00k\xb1\xc5\xff\x00\xe6\x82\xba\x97\x81n;\x9b\xc7\xe9@?\x07\x05%\xb1\x14\xb8\x19M\x7f\x07C\xa8\x1e_\xeb\xed]\r6\xfa\xb5L\xfb\x80\x89\xf1\xf0+\x85\xe9\xf9.\xad\xe6\xb3\x1b\xab:x~\xef\xfe\x93z\xe90\xba\x93+\x1b\x88\xde\x1c\xd2CI\x8f\xeb\x07\x7fU6AQ\xa1 N\xa3\xab\xb1S\x880Dx\xa3H\xe3\xb7\x8a\xc0\xb7\xeb#\x1ae\x95\xb1\xa7\xb4\xcb\xbf*\xa8\xff\x00\xadY%\xcd\xf7\x80$h\x00\x03\x94\xde\x1b]\xc4\x00\xaa>\x05\xff\xd4\xec+f=Cet\xb1\xa2=\xc44k\xe5\xc2\x8024\xf0\xfe*\x1bL\xc8\x91\xf8\xa9M\xbf\xbc>`\xa7\x13h\xb1\xdds\xfd\xe9\x84\x93\xf7~)\x89|}&\xfd\xc6!&\xfa\xae\x91\xa1\xf1(W\x9a\xacwiu\x8c\xa3\x8b\x82\xe2\xd2E\x96CX|\x0f\xef\x7feq\x99\x17n\x93\xc3d2\xb0t\xd0h\xd1\xff\x00~]\xbeoL\xc6\xcb-vF\xf7\xec\xe1\xa1\xc5\xa3\xe3\x01WgA\xc0kf\xa6\r\xe2H\xdc\x03\xa3\xb6\x8ew\xb9>2\x11\x0bH\xb7\x88e\xfbw9\xa7@D\x1f)B\xb3\'Y=\xe7_\x8f\xb9Z\xea8\xce\xc6\xcc\xba\x97\x00\xc2\\ \r\x00\x80\\\xe8\xfe\xb2\xcb\xb2`\x13\xc1\xef\xe1\xddIv\x16\xd7F\xe7\xdb\x1c\xfal`v\xcb*"\xd6?\xcd\x9f\xf9\x8a\xe8\xba\x17Z\xa3\xa94ce4U\x94\x00;N\x81\xe3\xf7\xea\xff\x00\xc8\xae5\xa5\xcd\xb0\x9f\xde\xd3\xe3*\xe6.\x1d\x9bX\xf2%\xa3\xbfp<\x7f\xb2\xa2\xcd\xc3Z\xe8z69{\xe2\xa1\xb7_\xe2\xfa;1\xb1\xaa\x1b\xe3_\x12g\xf2\xaes\xeb\x1fZk\x1aqqHu\x8e\xd1\xce\x1a\x86\x85\x06\x0b\xcda\x8f\xbe\xc74\x0e\x0b\x89Y\xd9\x98\xf5\xd6\x1c\xe8\xe0J\xad\xc66mpnL\xac\xb9]6m\xea-.%\xde\xfd\xa0\xfc5\xe1X\xfa\xca\xf02q\x9885\xb9\xe7\xfbN\xff\x00b\xad\xd1\xc1\xfbC\\>\x97\xb8\xf3\x02]\xed\x08\xdfYK]\x93\x8c\xe1\xa95\x10~\x01\xe47\xf2+\xa0\xd0s\xf7\x95\xaf\xd0@\x0e\xbf \xe8X\x1a\xd6\x9f7;\x8f\xfa+v\x8b\xcd\x95\xda\x01\x87\x96\xee\x1d\xf5k\x9d?\xf4\x96\x0fMpf\x16a\x06=7T\xe0#\xbb].W\xf1rX\xdb\xedg``|\x1c7}$\xe0PCG1\xe7\x1f\xa8\xba5e\xda\xb7\xc2O\xd2\xaf\xf1\xda\x89oS{X\xd3\xbb\xd9f\xa4\x9e\xcf\x1c\xcf\xf5\xda\xac\xe4t\xa7u\x1am\xf4,\x1e\xb5>\xff\x00E\xc2\x0f\xf5\xe9\x7f\xf6\xb6\xb9\xab\x02\xf7]K\xfd;D\x17\x0fp
7\xd5\xeb\x9b}vd\x08\x15\xfb\x88\x1aK\\c\xfe\x8f\xe7=h\xbb\xa3\xdbE\xa5\xad\'\xd1t\x96\x07v\x9eXO\xf2WH\xea\x00y\r\xd1\xbbuq\xe6%\x0f!\xa3\xd1\x87\t\x9fh\x1e%7 \xe2\xdc\xae\xc53\x03\xa3\xcb\xd4\xdb\xe05\xads\xc8\x03t\x0e\x16oX\xc8m4X\xc7\x82,x\xd8\xd6\x9d?\xac\xef\xec\xae\xc6\x9aYF!k4\x07s\xbf\xde\xbc\xff\x00\xeb\x06K\xaf\xea\x97W\xbb\xdbCv\xc7\x9f\x7f\xec\xfb\x94p\xc6,}\xac\xf2\xceH47\xd1\x8fN\x01\xa0\x1e\x1cZ\x08\x9f\x8c\xa6\xea\xaf\xf5l\xad\xa0{\xeb\x90<\xf7~\x92?\xf07\'\xc6pc\x88\xee6\x88\xf8\xc7\xfeEB\xc7\x86d\x9bH\x07m\x80\xc1\xd6@\xdc\xdd\x7f\xb2\xe5j\xf4%\xab\xd5]=\xff\x00\xabfW?M\x92O\x91<\xa5FL\xe5\xb8\x9d=@\x08\x1f\x01\xc7\xe0\xa3\x8a\xe0\xcc\x8c\xaa\xeb\x11\xbc;gq\xa6\xbb\x7f\xab\xb8\xaa\xfb\x9a/\xad\xcd\xd0\t\x02|\x07\xd0\x9f\xf3\x92\xe3\x02\x8f\x8d\'\x86\xed\xd7\xab1\xd4Z2XL\xd6v\xbf\xcd\xae\xff\x00\xcev\xaa\xfdZ\x86e\x07dT\x0e\xe0}\xed\x03\xbf;\xf6\xfek\x93a:\x97\xe4W]\xe4\xd7M\xa4\xb1\xce\x1f\x99\xbcK_\xfer\xd1\xc1\xad\xf8W\x9a\xf2Z\r\x91\xfa\'~e\xcc\xec\xcd\xdf\xf9\xed\xff\x00\xe0\xacR\x13cE\xbb\x17\x91wpu\xf3\x1f\xc1\nL\xc1\xf9-N\xb1\x84\xea-~C\x18YS\xdcIi\x11\x12~\x8f\xf6\x7f9f\x1d\xb2\x0c\xa8dW?\xff\xd6\xebc\xc4}\xc5E\xd3\xe0u\xf3\xd1<\x8f-?\x0f\xfc\xe5\t\xc7\xdc\xd6\xc0\xd4\x81\x12\x9c\xc6\xdc`\x01\x81\xbe_\x8a\x98\x08-i\x99Fl\xcf\x92%\x902\x89\xfe\n64\xb9\x84\r\x1d\x1a)\x8f5\x17\xce\xd3\x1a\x180SR\x8d\xa4\xfaA\xc4A\x89#\xbc\xc2\x89\x10\xc0;\x8f\xca\x93\xcc\xb6\xba\xf4\x1b\xcc\x11\xe4\x06\xe7\xff\x00\xe4T\x9eI"4<\xf9\xa4\x10Q\x9fn\xa7_\x15V\xc6z\x87q\xee \x0f\x00\x7f\xef\xceG\xb0\x8d\x1b\xd8j{|\x02f\x89\xd4\xa4V\xf5je\xfb*\xe3B#\xe1<\xaf6\xeb8\xe6\x9c\xeb\xad:\x8bk\x07\xe0\xed\xde\xff\x00\xfa!z\'T\xb2+x\xf0j\xe1\xba\xc5$\xd1u\xb1$\x02g\xc2\x02h\xa1-W~\x8bR\x997;\xb9\xdc\xc5]\xec$\xbex\xdd\x13\xfd\xa3YG\xc2\x97d\x07\rg\xd2x\xf0#\xbaF\xa8\xc36O\xf8M\xcd\xf1\x8d\xcev\x8aC\xb0\xea\xb0U\x94\x18\xc4\xb708\x89\xdcv\xc1\xf3\x1f\xf9\x8a\x05\xcds,,~\x8ec\xc82\xa5\x90]E\xcdx\x90$\x91\x1e3\xbb\xff\x00"\x9b"\xd9\xb1\xe0\x86\xef\x0e/\x16\x19\x92\x0cm\x05G2A#\xa0?\x9a\xf0j\xce\xec\x9d\xb8\n\xech\xe0\xc6\xba\x89o\xbb_\xeb1l\xe2\xb6\xeb\xb0\xd8\xf6\xbb}:\xba\xa6w\x04\xfd&\xb7\xfa\xbf\xb8\xb1\xf1\xc3\xaf\xae\xccfj^wT\xde=\xed\x12\xdf\xea\xfbw\xab=\x17(\xb0YQ06\x9b\x1a\x08\x11\xa0\xdd\x1e\xef\xceSc\x96\x9f\x8a\xc9\xbb7\xe5\xd7\xd4ze\xb58\x03xi\xf5\x84s\x03\xfaK\x7f\x97\xed\xfd"\xe2\xddK\xdbx\xa4\xfd"\xe0\xdf)>k\xae\xeaX\xb7\xf4\xeb\x19\x9fV\xb5<\x07\xd8\x04H\xd3s\xb8\x1f\xba\xef\xfd\x1a\xb1\xb2\xf1\xa9\xfbMYL\xf7c\x92\xdbG\x9da\xc0X\xdf\xfa\xcaS\xee\x80{\xbf\xff\xd7\xea\x8b\xbc\xcf\xc6\x10kx~c\x19\xc8\r/:F\x83\xda?\xe9\x1578\xff\x00+\xfd\x7f\xf2_\xf5h8A\xce\xca\xb6\xd1\xba\x03Z\xd9=\xe3\xfe\xfe\x8fP\xc7\x1d\xdd&A\x84@\x10\xab\x1f$q\xc2%\x94.\x06\x8a."\n\x92\x15\xce\xda\xd2|\x04\xc2@(\x94A\x8dvF\xe8\xfem\xbbD\xf1\xaf\xb9J\xc2\x00$\xa6\xa9\xc6%\xdc\x9dJs\xeetvn\xa7\xe2\x8d-\xe8\x8bc\x88\x05\xda\x93\xa9\xf8\xa4\xefkQL\x00\x81g\xbaGd\x90tr\xf3\x01\xb0:$\xf7 \xf9.k\xad\x86\xd1\xd2\xecs\xb5/;u\xef$1\xbf\xf5K\xac\xb5\xad\rqtk?\xf9\x8bW\x0b\xf5\xcf\xa9\xd0\xe7\xd3\x85K\x83\xddY6\xdd\xb7\x80uk+\xfe\xb7\xe7\xa8\xe8\xdf\xe2\x98\x9d\x1cJ\xafsMM\x1fJ\x1a\xcf\x8e\xabV\xc2\xc1\x83\x02\x0f\xbe\x00\xee\t.\xf7\x7f\'\xf7V6%6\xdfd\xb0n\xf4\x88q\xfe\xb6\xa6\xb6\x7foj\xb4\xfblu\xc2\x96\x12\xe7=\xcd\xda\x07\x89\x1b\x86\xdf\xebnRF\x8cM\xf7ZF\xb6\x93&\xb6\xdf\x84\xcb\x00\xfaDk\xc49\xad\xda\xf6\xbb\xfa\xfe\xc5\x9bk\x83\x98\xd7\x93\xcb6\x9f\x12Z\xb6\xf3\x9b]8\xd5\xe3\xf2+yn\xef3\xed\x99\xfe\xb2\xc3\r\x0e\xaa\xc6\x1d\x1c\xd3\xb9\xbf\xf7\xf6\xff\x00\x9a\xf4\xb2F\xcd\xf8&24\x97\r\xf6z\x85\xd5\xe8\xe6\xea\xdf\x88Se\xae\xc7\xc9m\xd5\x9ft\xefh\xed\xbb\x97\xd7\xfez\xb9\xf5s\x06\xac\x97\xdfm\xdb\x9c\xdc\x7fL2\xb6\xf3c\x9eN\xca\xbf\xe8\xeew\xf2\x14\xba\x87O\x03,\xb0\xfbX\xf8{\xcbD\x86\x7f/O\xcd\xfd\xff\x00\xe4&\xc4\x91C\xbe\xca\'wq\x99?n\xe9\xb5\x86:j\x86\xb8Xy\x05\xbe\xd77l\xfb\x7f\xd1\xaez\xfcc\x8d\x96\xcav\xb1\xd8\xd7\xdc\xd0iq!\x95\xb9\xc7h5\xbf\xf3\xb1n\xab\xd9\xfdO\xd1\xfeb\x8fK\xea\xd6\xf4\xec\x87\xd5k\x03\xeb\xb1\xe3\xd4\xae~\x8b\xff\x00\xd2T\xef\xa3\xb1\xff\x00\x9d\xfb\xebG\xa8\xdd\x8f`\xc6\xcaa\x07fEg\xd3l\x98h\xb1\xa5\xfb\xd9\xf4\xfe\x9ay\xd9g]_\xff\xd0\xdf\xb1\xfc\x83\xb8\x0e$s\x1fw\xe6\xa3`\xc0\xc7.\xe0\xbd\xc4\x90|\xbd\xaa\xb665\x99@X\xf2\xea\xeaw\xde\xee\xde\xd6\xff\x00\xa2Z\x952\xba\x9a\x1a\xc6\x86\x80 w\xff\x00\xaaF6uY\x10\x92\xb9\x03\xf8\xa2\x840\xe0O\x8a\x98\xd7\xcf\xc3\xf8\xa7/e\xd9\x02\xff\x00\xe6\xdc\x11\tp\xd4\x84;v\xda\xc2\xdd\xdbI\xe0\x8d\x0c\xa4\x14Q\xb7\xb3[\xc9\xd6<\x07\xef"4F\x83\xe3\xfcP\xeb\x1bDw\xfc\xa5I\xce\x10A\xd5\x14\x04y\x99X\xf8\x94>\xfc\xab\x1bU\x157u\x8fw\x00.#/\xfc`\xe4ed\x9c~\x8d\x84\\\xd0t\xb2\xd1\xb9\xe4\x7f\xa4\xf4\x1b\xec\xa9\x9f\xf1\x96!\xff\x00\x8c<\xdb\xddv\x1e\x1b\x9cj\xc5w\xe9m\x7fm\xc5\xde\x9e\xe2\xd1\xf4\x9bC?H\xba\xcc\x0e\x91\xd2\xbaf+j\xc1`\xf4Z71\xe3\xdc^`E\xe4\xfe{\xeco\xe7"\xb4\xbc/T\xbf\xebVF=\xb6\xddm\x94R\xd1/\x07mp5s\xc7\xe8\xc6\xff\x00\xddY=\x1f\xea\xff\x00R\xeb2\xfcv\x8a\xb1\xf7mvM\x87\xdb\xfb\xae\xdb\xf9\xd69u_\\sl\xce\xbf\x1b\xa2\xd4\xff\x00L\xe6X\xdf\\\xb64\xabv\xde\x7f?\xdd\xef]..>/L\xc1\r\r\x0c\xc6\xc7`\x0ch\xd3\xd8\xd1\xec\xdd\xbb\xfc#\xdd\xeeM\xae\xaa\xe9O7\xd60:\x7f\xd5\xbe\x82(\xa8\x96\xdd\xa3\xdc\xf7\x80\x1e\xfb\x9c>\x96\x9f\xc8\xfc\xdf\xf0U\xae\x7f\xa6m\xfb~-\xb6\xb0\xd7u\xb4\x17P\xc6\xe96\x0fkv\x0f\xea~b\xd0,\x7f\xd6.\xadv~cH\xe9\x98.\x81Y\xd4Ya\xfa57\xf7\xd9\xfc\xaf\xf8\xbf\xdfF\xeb\xbd?%\xf9=3)\xac\xfd5\x96\xb9\xad\xa5\xa0h\xd6\xd6\xe7\xec\xf7\xfe\x8d\xd6m\xab\xfc\xff\x00\xd1\x7f\x83DV\xbe4\xa3\xb0\xf0r\xba\xc3\x1f@~5\xc0\x07\xb6\xe79\xa6}\xb0@\xfd\x1b\x7f\xb3\xb1b\xb5\xe3\xd5!\xc7B\x08\x9f\x88+c\xae>\x9bq\xa8\xb9\x8f\x16\x0b4$nk\x83\x98\\\xd6\xfa\x8c~\xed\xb6\xfa\x0en\xff\x00\xf8JV\x1b\x98\x19k\x81\xe4\x1f\x87o\x04$6P:=/\xd5\x0b\x18,\xcc\x03S\xb6\xb7\xb1\xbe&__\xfd\xf9Z\xea\xd4X\x18\xfcZ\x07\xa9\x95k\x8b\xedp\xecN\x8d\xad\x9f\xeb\xecX\x1fWs\x86\'U\xa8\xdav\xd5i\x15\xbd\xde\x12\x7fGg\xf6\x1e\xbb\x1cm\xcf\x06\xd2\xd0\x1fu\xf6:x\x04\xb0\x1aX\xed\xff\x00\xbb\xb1\xadN\x00\x11kI\xd5\xe3:\x8fI\xb7\x1b\xdb\xbb\xd4\xb0\t\x86\xce\x9f\xbc\xcf\xec\xa8Q}9X\x976\xe3\xb3:\x86\xee\xaa\xe0K]f\xd2=\xaf\x83\xef\xb2\xbf\xf3\xd7W\xd6zO\xa9k-\xad\xc5\xce\x04@q\x91\xc8\xfc\xdf\xfc\xc9`u\x0e\x9b[:\x86;\xeb\xac\xb1\xe6\xe62\xd6~i%\xc3k\xc1\xfd\xe7&^\xfe\t\xec?\x17\xff\xd9', 'adobe': 100, 'adobe_transform': 100}
new类
Image.new(mode,size) ⇒ image
Image.new(mode, size,color) ⇒ image
使用给定的变量mode和size生成新的图像。Size是给定的宽/高二元组,这是按照像素数来计算的。对于单通道图像,变量color只给定一个值;对于多通道图像,变量color给定一个元组(每个通道对应一个值)。在版本1.1.4及其之后,用户也可以用颜色的名称,比如给变量color赋值为“red”。如果没有对变量color赋值,图像内容将会被全部赋值为0(为黑色)。如果变量color是空,图像将不会被初始化,即图像的内容全为0。这对向该图像复制或绘制某些内容是有用的。
如下为将图像设置为128x128大小的红色图像。
from PIL import Image
n_im = Image.new("RGB", (128, 128), "#FF0000")
n_im.show()
运行结果:
如果变量color不赋值的话,图像内容被设置为0,即黑色。
from PIL import Image
n_im = Image.new("RGB", (128, 128))
n_im.show()
运行结果:
图像为128x128大小的绿色图像。
from PIL import Image
n_im = Image.new("RGB", (128, 128), "green")
n_im.show()
运行结果:
Copy类
im.copy() ⇒ image
拷贝这个图像。如果用户想粘贴一些数据到这张图,可以使用这个方法,但是原始图像不会受到影响。
from PIL import Image
im = Image.open("a.jpg")
# 拷贝
im_copy = im.copy()
# 保存
im_copy.save("a_copy.jpg")
运行效果如下:
a.jpg | a_copy.jpg |
图像im_copy和im完全一样。
Crop类
im.crop(box) ⇒ image
从当前的图像中返回一个矩形区域的拷贝。变量box是一个四元组,定义了左、上、右和下的像素坐标。用来表示在原始图像中截取的位置坐标,如box(100,100,200,200)就表示在原始图像中以左上角为坐标原点,截取一个100*100(像素为单位)的图像,为方便理解,如下为示意图box(b1,a1,b2,a2)。
from PIL import Image
im = Image.open("a.jpg")
box = (60, 10, 140, 110) # 确定拷贝区域大小
region = im.crop(box) # 将im表示的图片对象拷贝到region中,大小为box
region.show()
如下图为box截取的图像区域显示:
Paste类
im.paste(image,box)
将一张图粘贴到另一张图像上。变量box或者是一个给定左上角的2元组,或者是定义了左,上,右和下像素坐标的4元组,或者为空(与(0,0)一样)。如果给定4元组,被粘贴的图像的尺寸必须与区域尺寸一样。如果模式不匹配,被粘贴的图像将被转换为当前图像的模式。
from PIL import Image
im = Image.open("a.jpg")
box = (60, 10, 140, 110) # 确定拷贝区域大小
im_crop = im.crop(box)
print(im_crop.size, im_crop.mode)
im.paste(im_crop, (20, 20)) # (100,100,0,0)
im.paste(im_crop, (100, 80, 180, 180)) # 被粘贴的图像的尺寸必须与区域尺寸一样
im.show()
如下图为paste操作:
Filter类
im.filter(filter) ⇒ image
返回一个使用给定滤波器处理过的图像的拷贝。具体参考图像滤波在ImageFilter 模块的应用,在该模块中,预先定义了很多增强滤波器,可以通过filter( )函数使用,预定义滤波器包括:BLUR、CONTOUR、DETAIL、EDGE_ENHANCE、EDGE_ENHANCE_MORE、EMBOSS、FIND_EDGES、SMOOTH、SMOOTH_MORE、SHARPEN。其中BLUR就是均值滤波,CONTOUR找轮廓,FIND_EDGES边缘检测,使用该模块时,需先导入。
from PIL import Image
from PIL import ImageFilter # 调取ImageFilter
imgF = Image.open("a.jpg")
bluF = imgF.filter(ImageFilter.BLUR) # 均值滤波
conF = imgF.filter(ImageFilter.CONTOUR) # 找轮廓
edgeF = imgF.filter(ImageFilter.FIND_EDGES) # 边缘检测
imgF.show()
bluF.show()
conF.show()
edgeF.show()
运行效果:
原图 |
均值滤波
|
寻找轮廓
|
边缘检测
|
Blend类
Image.blend(image1,image2, alpha) ⇒ image
使用给定的两张图像及透明度变量alpha,插值出一张新的图像。这两张图像必须有一样的尺寸和模式。
合成公式为:out = image1 (1.0 - alpha) + image2 alpha
若变量alpha为0.0,返回第一张图像的拷贝。若变量alpha为1.0,将返回第二张图像的拷贝。对变量alpha的值无限制。
from PIL import Image
im1 = Image.open("a.jpg")
im2 = Image.open("b.jpg")
print(im1.mode, im1.size)
print(im2.mode, im2.size)
im = Image.blend(im1, im2, 0.3)
im.show()
需保证两张图像的模式和大小是一致的,如下为显示im1和im2的具体信息。
im1和im2按照第一张70%的透明度,第二张30%的透明度,合成为一张。
im1 | im2 | im1 + im2 |
Split
im.split() ⇒ sequence
返回当前图像各个通道组成的一个元组。例如,分离一个“RGB”图像将产生三个新的图像,分别对应原始图像的每个通道(红,绿,蓝)。
from PIL import Image
im = Image.open("a.jpg")
r, g, b = im.split()
print(r.mode)
print(r.size)
print(im.size)
运行结果:
Composite类
Image.composite(image1,image2, mask) ⇒ image
复合类使用给定的两张图像及mask图像作为透明度,插值出一张新的图像。变量mask图像的模式可以为“1”,“L”或者“RGBA”。所有图像必须有相同的尺寸。
from PIL import Image
im1 = Image.open("a.jpg")
im2 = Image.open("b.jpg")
r, g, b = im1.split() # 分离出r,g,b
print(b.mode)
print(im1.mode, im1.size)
print(im2.mode, im2.size)
im = Image.composite(im1, im2, b)
im.show()
运行结果:b.mode为”L”,两图尺寸一致。
最终效果:
im1 | im2 | im1 + im2 |
Eval类
Image.eval(image,function) ⇒ image
使用变量function对应的函数(该函数应该有一个参数)处理变量image所代表图像中的每一个像素点。如果变量image所代表图像有多个通道,那变量function对应的函数作用于每一个通道。注意:变量function对每个像素只处理一次,所以不能使用随机组件和其他生成器。
from PIL import Image
im = Image.open("a.jpg")
def fun01(x):
return x * 0.3
def fun02(y):
return y * 2.0
im1_eval = Image.eval(im, fun01)
im1_eval.show()
im2_eval = Image.eval(im, fun02)
im2_eval.show()
运行效果:
im1 | fun01 | fun02 |
Merge类
Image.merge(mode,bands) ⇒ image
合并类使用一些单通道图像,创建一个新的图像。变量bands为一个图像的元组或者列表,每个通道的模式由变量mode描述。所有通道必须有相同的尺寸。
变量mode与变量bands的关系:
len(ImageMode.getmode(mode).bands)= len(bands)
from PIL import Image
im1 = Image.open("a.jpg")
im2 = Image.open("b.jpg")
r1, g1, b1 = im1.split()
r2, g2, b2 = im2.split()
print(r1.mode, r1.size, g1.mode, g1.size)
print(r2.mode, r2.size, g2.mode, g2.size)
new_im = [r2, g1, b1]
print(len(new_im))
im_merge = Image.merge("RGB", new_im)
im_merge.show()
运行结果:
运行效果:
im1 | im2 | im1+im2 |
Draft类
im.draft(mode,size)
配置图像文件加载器,使得返回一个与给定的模式和尺寸尽可能匹配的图像的版本。
from PIL import Image
im = Image.open("a.jpg")
print(im.size, im.mode)
new_im = im.draft("L", (100, 50))
print(new_im.size, new_im.mode)
new_im.show()
运行结果:
运行效果:
原图 | 转换后 |
Getbands类
im.getbands()⇒ tuple of strings
返回包括每个通道名称的元组。例如,对于RGB图像将返回(“R”,“G”,“B”)。
from PIL import Image
im = Image.open("a.jpg")
print(im.getbands())
运行结果:
Getbbox类
im.getbbox() ⇒ 4-tuple or None
计算图像非零区域的包围盒。这个包围盒是一个4元组,定义了左、上、右和下像素坐标。如果图像是空的,这个方法将返回空。
from PIL import Image
im = Image.open("a.jpg")
print(im.getbbox())
运行效果:
Getdata类
im.getdata() ⇒ sequence
以包含像素值的sequence对象形式返回图像的内容。这个sequence对象是扁平的,以便第一行的值直接跟在第零行的值后面,等等。这个方法返回的sequence对象是PIL内部数据类型,它只支持某些sequence操作,包括迭代和基础sequence访问。使用list(im.getdata()),将它转换为普通的sequence。Sequence对象的每一个元素对应一个像素点的R、G和B三个值。
from PIL import Image
import numpy as np
im = Image.open("a.jpg")
sequ = im.getdata()
print(sequ)
print(np.array(sequ))
sequ_list = list(sequ)
print(sequ_list[0])
print(sequ_list[1])
print(sequ_list[2])
运行
Getextrema类
im.getextrema() ⇒ 2-tuple
该方法返回了R/G/B三个通道的最小和最大值的2元组。包括该图像中的最小和最大值。
from PIL import Image
im = Image.open("a.jpg")
print(im.getextrema())
运行结果:
Getpixel类
im.getpixel(x, y) ⇒ value or tuple
返回给定位置的像素值。如果图像为多通道,则返回一个元组。该方法执行比较慢;如果用户需要使用python处理图像中较大部分数据,可以使用像素访问对象(见load),或者方法getdata()。
from PIL import Image
im = Image.open("a.jpg")
print(im.getpixel((0, 0)))
print(im.getpixel((4, 0)))
r, g, b = im.split()
print(b.getpixel((11, 8)))
运行结果:
Histogram类
im.histogram()⇒ list
返回一个图像的直方图。这个直方图是关于像素数量的list,图像中的每个象素值对应一个成员。如果图像有多个通道,所有通道的直方图会连接起来(例如,“RGB”图像的直方图有768个值)。二值图像(模式为“1”)当作灰度图像(模式为“L”)处理。
from PIL import Image
im = Image.open("a.jpg")
imhis = im.histogram()
print(imhis)
print(len(imhis))
print(imhis[0])
print(imhis[150])
print(imhis[300])
运行结果:
[20, 7, 6, 7, 15, 14, 15, 16, 32, 26, 34, 40, 64, 84, 97, 69, 78, 69, 80, 114, 92, 85, 93, 91, 90, 108, 91, 98, 95, 105, 113, 112, 103, 131, 125, 118, 153, 133, 134, 141, 165, 136, 124, 167, 119, 124, 134, 137, 147, 133, 141, 155, 144, 138, 132, 121, 119, 137, 133, 126, 131, 116, 118, 115, 129, 94, 119, 102, 101, 111, 99, 102, 93, 94, 91, 100, 95, 101, 91, 100, 93, 90, 124, 93, 105, 96, 102, 96, 93, 96, 90, 84, 96, 96, 103, 97, 97, 118, 107, 103, 82, 98, 108, 92, 90, 89, 92, 92, 94, 96, 100, 98, 102, 93, 109, 106, 91, 109, 88, 106, 95, 100, 105, 103, 99, 104, 96, 103, 121, 115, 108, 103, 114, 115, 150, 122, 129, 104, 125, 128, 134, 124, 125, 102, 139, 125, 124, 133, 129, 129, 139, 141, 153, 120, 137, 113, 136, 131, 140, 128, 97, 92, 122, 116, 114, 100, 122, 108, 125, 132, 114, 144, 134, 133, 109, 139, 182, 214, 238, 254, 265, 317, 318, 369, 395, 385, 395, 391, 434, 414, 470, 512, 615, 627, 586, 531, 560, 522, 500, 470, 493, 486, 467, 461, 488, 524, 456, 484, 474, 455, 452, 411, 496, 480, 456, 456, 272, 313, 2209, 206, 538, 201, 77, 48, 24, 7, 7, 1, 2, 2, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 4, 0, 3, 2, 4, 6, 9, 19, 21, 27, 41, 54, 61, 44, 55, 68, 78, 94, 116, 100, 114, 89, 96, 96, 91, 118, 107, 109, 131, 140, 120, 126, 111, 128, 114, 122, 136, 134, 137, 129, 142, 131, 135, 128, 140, 111, 127, 134, 123, 126, 113, 116, 129, 130, 128, 116, 105, 110, 107, 115, 101, 130, 98, 128, 119, 115, 113, 124, 104, 87, 84, 105, 81, 88, 90, 95, 104, 105, 119, 107, 94, 104, 86, 100, 94, 99, 92, 120, 110, 88, 97, 115, 114, 122, 105, 112, 94, 126, 108, 136, 127, 124, 120, 122, 114, 119, 119, 124, 119, 144, 116, 119, 113, 126, 121, 111, 103, 113, 109, 105, 113, 112, 87, 96, 127, 101, 121, 91, 117, 118, 110, 94, 101, 112, 132, 119, 98, 137, 102, 128, 118, 115, 131, 117, 109, 117, 124, 123, 112, 142, 146, 136, 147, 142, 130, 127, 133, 136, 136, 131, 157, 170, 165, 166, 171, 181, 171, 193, 225, 271, 237, 229, 185, 217, 202, 270, 239, 261, 251, 285, 295, 328, 324, 323, 320, 360, 424, 544, 713, 769, 810, 895, 789, 736, 633, 596, 551, 587, 538, 513, 417, 470, 469, 445, 484, 460, 407, 307, 222, 151, 175, 159, 144, 249, 601, 2172, 214, 84, 34, 18, 11, 12, 4, 4, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 1, 4, 7, 1, 11, 12, 12, 21, 20, 20, 28, 36, 44, 61, 68, 74, 68, 83, 80, 89, 97, 69, 78, 81, 72, 97, 86, 76, 73, 84, 66, 73, 79, 73, 70, 63, 78, 85, 62, 84, 84, 79, 62, 73, 83, 93, 80, 71, 84, 108, 114, 97, 106, 101, 90, 101, 101, 107, 100, 95, 107, 97, 101, 113, 111, 108, 105, 97, 118, 80, 129, 114, 87, 104, 100, 90, 84, 117, 111, 96, 123, 104, 102, 102, 109, 102, 112, 105, 106, 103, 98, 92, 89, 80, 103, 103, 80, 88, 111, 86, 93, 94, 104, 87, 76, 91, 96, 103, 81, 92, 87, 82, 82, 72, 73, 99, 73, 89, 88, 99, 123, 84, 94, 105, 110, 125, 103, 105, 114, 107, 124, 106, 106, 118, 136, 129, 111, 156, 141, 142, 131, 145, 164, 126, 131, 153, 150, 120, 149, 115, 129, 139, 141, 161, 124, 144, 154, 151, 150, 162, 159, 164, 164, 154, 159, 153, 160, 165, 148, 172, 188, 157, 168, 195, 182, 181, 199, 201, 232, 226, 247, 292, 265, 311, 284, 321, 322, 371, 347, 364, 383, 432, 440, 484, 514, 498, 537, 558, 565, 615, 598, 656, 625, 578, 539, 616, 563, 598, 565, 603, 480, 454, 466, 402, 416, 329, 288, 333, 330, 329, 169, 379, 155, 2157, 150, 151, 67, 40, 35, 29, 23, 12, 14, 12, 13, 11, 2, 6, 2, 2, 0, 1, 0, 1, 0, 0, 0, 0, 0]
768
20
139
137
im.histogram(mask)⇒ list
返回图像中模板图像非零地方的直方图。模板图像与处理图像的尺寸必须相同,并且要么是二值图像(模式为“1”),要么为灰度图像(模式为“L”)。
from PIL import Image
im = Image.open("a.jpg")
r, g, b = im.split()
imhis = r.histogram()
print(r.mode)
print(len(imhis))
print(imhis[0])
print(imhis[50])
print(imhis[220])
运行结果:
Load类
im.load()
为图像分配内存并从文件中加载它(或者从源图像,对于懒操作)。正常情况下,用户不需要调用这个方法,因为在第一次访问图像时,Image类会自动地加载打开的图像。在1.1.6及以后的版本,方法load()返回一个用于读取和修改像素的像素访问对象。这个访问对象像一个二维队列,如:
pix = im.load()
print pix[x, y]
pix[x, y] =value
通过这个对象访问比方法getpixel()和putpixel()快很多。
from PIL import Image
im = Image.open("a.jpg")
pix = im.load()
print(pix[0, 2])
运行结果:
im.paste(colour,box)
使用同一种颜色填充变量box对应的区域。对于单通道图像,变量colour为单个颜色值;对于多通道,则为一个元组。
from PIL import Image
im = Image.open("a.jpg")
im.paste((255, 255, 0), (0, 0, 30, 30)) # (255,255,0)表示黄色
im.show()
运行效果:
from PIL import Image
im = Image.open("a.jpg")
im.paste("blue", (0, 0, 30, 30)) # 或者“blue”
im.show()
运行效果:
im.paste(image,box, mask)
使用变量mask对应的模板图像来填充所对应的区域。可以使用模式为“1”、“L”或者“RGBA”的图像作为模板图像。模板图像的尺寸必须与变量image对应的图像尺寸一致。如果变量mask对应图像的值为255,则模板图像的值直接被拷贝过来;如果变量mask对应图像的值为0,则保持当前图像的原始值。变量mask对应图像的其他值,将对两张图像的值进行透明融合,如果变量image对应的为“RGBA”图像,即粘贴的图像模式为“RGBA”,则alpha通道被忽略。用户可以使用同样的图像作为原图像和模板图像。
from PIL import Image
im = Image.open("a.jpg")
box = [70, 50, 100, 80]
im_crop = im.crop(box)
r, g, b = im_crop.split()
im.paste(im_crop, (20, 20, 50, 50), r)
im.show()
运行效果:
Putdata类
im.putdata(data)
im.putdata(data, scale, offset)
从sequence对象中拷贝数据到当前图像,从图像的左上角(0,0)位置开始。变量scale和offset用来调整sequence中的值:
pixel = value*scale + offset
如果变量scale忽略,则默认为1.0。如果变量offset忽略,则默认为0.0。
from PIL import Image
im = Image.open("a.jpg")
r, g, b = im.split()
print(
r.getpixel((0, 0)),
r.getpixel((1, 0)),
r.getpixel((2, 0)),
r.getpixel((3, 0)),
r.putdata([1, 2, 3, 4]),
r.getpixel((0, 0)),
r.getpixel((1, 0)),
r.getpixel((2, 0)),
r.getpixel((3, 0)),
)
Resize类
im.resize(size) ⇒ image
im.resize(size, filter) ⇒ image
返回改变尺寸的图像的拷贝。变量size是所要求的尺寸,是一个二元组:(width, height)。变量filter为NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一。如果忽略,或者图像模式为“1”或者“P”,该变量设置为NEAREST。在当前的版本中bilinear和bicubic滤波器不能很好地适应大比例的下采样(例如生成缩略图)。用户需要使用ANTIALIAS,除非速度比质量更重要。
from PIL import Image
im = Image.open("a.jpg")
region = im.resize((300, 400)) # 重新设定大小
region.show()
运行效果:很明显由于大小的重新设定,图片的显示效果有所转变
Rotate类
im.rotate(angle) ⇒ image
im.rotate(angle,filter=NEAREST, expand=0) ⇒ image
返回一个按照给定角度顺时钟围绕图像中心旋转后的图像拷贝。变量filter是NEAREST、BILINEAR或者BICUBIC之一。如果省略该变量,或者图像模式为“1”或者“P”,则默认为NEAREST。变量expand,如果为true,表示输出图像足够大,可以装载旋转后的图像。如果为false或者缺省,则输出图像与输入图像尺寸一样大。
from PIL import Image
im = Image.open("a.jpg")
im_45 = im.rotate(45)
im_30 = im.rotate(30, Image.NEAREST, 1)
print(im_45.size, im_30.size)
im_45.show()
im_30.show()
运行结果:
45 | 30 + NEAREST |
Seek类
im.seek(frame)
在给定的文件序列中查找指定的帧。如果查找超越了序列的末尾,则产生一个EOFError异常。当文件序列被打开时,PIL库自动指定到第0帧上。
from PIL import Image
im_gif = Image.open("c.gif")
print(im_gif.mode)
im_gif.show() # 第0帧
im_gif.seek(3)
im_gif.show()
im_gif.seek(9)
im_gif.show()
运行效果:
第0帧 | 第3帧 | 第9帧 |
Tell类
im.tell() ⇒ integer
返回当前帧所处位置,从0开始计算。
from PIL import Image
im_gif = Image.open("c.gif")
print(im_gif.tell())
im_gif.seek(8)
print(im_gif.tell())
运行结果:
Thumbnail类
im.thumbnail(size)
im.thumbnail(size, filter)
修改当前图像,使其包含一个自身的缩略图,该缩略图尺寸不大于给定的尺寸。这个方法会计算一个合适的缩略图尺寸,使其符合当前图像的宽高比,调用方法draft()配置文件读取器,最后改变图像的尺寸。变量filter应该是NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一。如果省略该变量,则默认为NEAREST。
from PIL import Image
im = Image.open("a.jpg")
im.thumbnail((100, 100))
im.save("a_thumbnail.jpg")
运行效果:
原图 | 缩略图 |
Transform类
im.transform(size,method, data) ⇒ image
im.transform(size, method, data, filter) ⇒ image
使用给定的尺寸生成一张新的图像,与原图有相同的模式,使用给定的转换方式将原图数据拷贝到新的图像中。在当前的PIL版本中,参数method为EXTENT(裁剪出一个矩形区域),AFFINE(仿射变换),QUAD(将正方形转换为矩形),MESH(一个操作映射多个正方形)或者PERSPECTIVE。变量filter定义了对原始图像中像素的滤波器。在当前的版本中,变量filter为NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一。如果忽略,或者图像模式为“1”或者“P”,该变量设置为NEAREST。
from PIL import Image
im = Image.open("a.jpg")
print(im.size)
imtra = im.transform((100, 100), Image.EXTENT, (0, 0, 150, 150))
print(imtra.size)
imtra.show()
运行结果:
效果:
im.transform(size,EXTENT, data) ⇒ image
im.transform(size, EXTENT, data, filter) ⇒ image
从图像中裁剪一个区域。变量data为指定输入图像中两个坐标点的4元组(x0,y0,x1,y1)。输出图像为这两个坐标点之间像素的采样结果。例如,如果输入图像的(x0,y0)为输出图像的(0,0)点,(x1,y1)则与变量size一样。这个方法可以用于在当前图像中裁剪,放大,缩小或者镜像一个任意的长方形。它比方法crop()稍慢,但是比resize操作一样快。
im.transform(size, AFFINE, data) ⇒ image
im.transform(size, AFFINE,data, filter) ⇒ image
对当前的图像进行仿射变换,变换结果体现在给定尺寸的新图像中。变量data是一个6元组(a,b,c,d,e,f),包含一个仿射变换矩阵的第一个两行。输出图像中的每一个像素(x,y),新值由输入图像的位置(ax+by+c, dx+ey+f)的像素产生,使用最接近的像素进行近似。这个方法用于原始图像的缩放、转换、旋转和裁剪。
from PIL import Image
im = Image.open("a.jpg")
print(im.size)
imtra = im.transform((100, 100), Image.AFFINE, (1, 2, 3, 2, 1, 4))
print(imtra.size)
imtra.show()
运行结果:
效果:
im.transform(size,QUAD, data) ⇒ image
im.transform(size, QUAD, data, filter) ⇒ image
输入图像的一个四边形(通过四个角定义的区域)映射到给定尺寸的长方形。变量data是一个8元组(x0,y0,x1,y1,x2,y2,x3,y3),它包括源四边形的左上,左下,右下和右上四个角。
from PIL import Image
im = Image.open("a.jpg")
print(im.size)
imtra = im.transform((100, 100), Image.QUAD, (0, 0, 0, 150, 170, 150, 170, 0))
print(imtra.size)
imtra.show()
运行结果:
效果:
im.transform(size,PERSPECTIVE, data) ⇒ image
im.transform(size, PERSPECTIVE, data, filter) ⇒ image
对当前图像进行透视变换,产生给定尺寸的新图像。变量data是一个8元组(a,b,c,d,e,f,g,h),包括一个透视变换的系数。对于输出图像中的每个像素点,新的值来自于输入图像的位置的(a x + b y + c)/(g x + h y + 1), (d x+ e y + f)/(g x + h y + 1)像素,使用最接近的像素进行近似。这个方法用于原始图像的2D透视。
from PIL import Image
im = Image.open("a.jpg")
print(im.size)
imtra = im.transform((100, 100), Image.PERSPECTIVE, (1, 2, 3, 2, 1, 6, 1, 2))
print(imtra.size)
imtra.show()
运行结果:
效果:
Transpose类
im.transpose(method)⇒ image
返回当前图像的翻转或者旋转的拷贝。变量method的取值为:FLIP_LEFT_RIGHT,FLIP_TOP_BOTTOM,ROTATE_90,ROTATE_180,或ROTATE_270。
from PIL import Image
im = Image.open("a.jpg")
im.show()
im_1 = im.rotate(45) # 逆时针旋转 45 度角。
im_1.show()
im_2 = im.transpose(Image.FLIP_LEFT_RIGHT) # 左右对换。
im_2.show()
im_3 = im.transpose(Image.FLIP_TOP_BOTTOM) # 上下对换。
im_3.show()
im_4 = im.transpose(Image.ROTATE_90) # 旋转 90 度角。
im_4.show()
im_5 = im.transpose(Image.ROTATE_180) # 旋转 180 度角。
im_5.show()
运行效果:
原图 | 逆时针旋转45度 | 左右对换 |
上下对换 | 旋转90度 | 旋转180度 |