原地址:http://hi.baidu.com/drunkdream/item/9c9ac638dfc46ec6382ffac5
實驗環境:
windows7+python2.6+pycrust+PIL1.1.7
實驗操作:
Image模塊
例子:打開、旋轉、顯示一副圖像
>>> import Image
>>> infile='e:/doc/program/python/2.6/study/temp/freebsd.jpg'
>>> im=Image.open(infile)
>>> im.rotate(45).show()
效果在實驗31里有,不貼了
創建縮略圖:
>>> import Image
>>> import os
>>> infile='e:/doc/program/python/2.6/study/temp/freebsd.jpg'
>>> file,ext=os.path.splitext(infile)
>>> im=Image.open(infile)
>>> im.thumbnail((128,128),Image.ANTIALIAS)
>>> im.save(file+'.thumbnail','JPEG')
這個在實驗31里也有,不貼了
函數:
new:
創建一張新圖片(800*600像素,黑色填充):
>>> imnew=Image.new('RGB',(800,600))
>>> imnew.show()
800*600像素,指定顏色:
>>> imnew=Image.new('RGB',(800,600),(100,200,255))
>>> imnew.show()
open:
打開一個圖像文件,這個前面已經有很多示例了
blend:
融合,alpha為0則返回第一張圖像的拷貝,1則返回第二張圖像的拷貝,例子取0.5,手冊說這個值沒有嚴格的限制。
>>> infile1='e:/doc/program/python/2.6/study/temp/freebsd.jpg'
>>> infile2='e:/doc/program/python/2.6/study/temp/app.jpg'
>>> im1=Image.open(infile1)
>>> im2=Image.open(infile2)
>>> im=Image.blend(im1,im2,0.5)
>>> outfile='e:/doc/program/python/2.6/study/temp/blend.jpg'
>>> im.save(outfile)
im1圖:
im2圖:
融合后的效果圖:
composite:
也是混合成類似的意思
>>> infile3='e:/doc/program/python/2.6/study/temp/l.bmp'
>>> im3=Image.open(infile3)
>>> print im3.mode,im3.size
1 (800, 600)
使用mask圖像作為alpha參數:
>>> infile1='e:/doc/program/python/2.6/study/temp/freebsd.jpg'
>>> infile2='e:/doc/program/python/2.6/study/temp/app.jpg'
>>> infile3='e:/doc/program/python/2.6/study/temp/l.bmp'
>>> im1=Image.open(infile1)
>>> im2=Image.open(infile2)
>>> im3=Image.open(infile3)
>>> outfile='e:/doc/program/python/2.6/study/temp/blend.jpg'
>>> im=Image.composite(im1,im2,im3)
>>> im.save(outfile)
im1、im2原圖前面有不貼了
im3是用windows的畫圖創建的800*600的單色位圖
合成后的效果圖:
Image.eval(function,image) =>image
對給定圖像的每一個像素應用function
Image.fromstring(mode,size,data) =>image
從字符串里的像素數據創建圖像,使用標准的"raw"解碼器
Image.fromstring(mode,size,data,decoder,parameters) =>image
跟上面一樣的,可以使用PIL支持的像素解碼器
有一些注意點,似乎我不太會用到先繼續往下。
Image.merge(mode,bands) =>image
也是合並的,跟bands相關的,不懂而且也用不到,先跳過往下
方法:
轉換模式:
im.convert(mode) =>image
>>> infile1='e:/doc/program/python/2.6/study/temp/freebsd.jpg'
>>> im1=Image.open(infile1)
>>> print im1.mode
RGB
>>> outfile1='e:/doc/program/python/2.6/study/temp/freebsd_out.jpg'
>>> im1.convert(mode='L').save(outfile1)
>>> print im1.mode
RGB
>>> imout=Image.open(outfile1)
>>> print imout.mode
L
im1原圖:
模式轉換后的效果圖:
使用變換矩陣來轉換圖像模式:
>>> infile1='e:/doc/program/python/2.6/study/temp/freebsd.jpg'
>>> outfile1='e:/doc/program/python/2.6/study/temp/freebsd_out.jpg'
>>> im1=Image.open(infile1)
>>> rgb2xyz=(0.412453,0.357580,0.180423,0,
... 0.212671,0.715160,0.072169,0,
... 0.019334,0.119193,0.950227,0)
>>> outim=im1.convert("RGB",rgb2xyz)
>>> outim.save(outfile1)
模式轉換后的效果圖:
拷貝、裁剪、粘帖:
>>> import Image
>>> box=(200,200,500,500)
>>> infile='e:/doc/program/python/2.6/study/temp/freebsd.jpg'
>>> outfile='e:/doc/program/python/2.6/study/temp/freebsd_out.jpg'
>>> im=Image.open(infile)
>>> imout=im.crop(box).save(outfile)
infile原圖:
裁剪圖:
把上面裁剪的圖粘帖到另一幅圖:
>>> infile1='e:/doc/program/python/2.6/study/temp/app.jpg'
>>> infile2='e:/doc/program/python/2.6/study/temp/freebsd_out.jpg'
>>> im1=Image.open(infile1)
>>> im=Image.open(infile2).copy()
>>> outfile='e:/doc/program/python/2.6/study/temp/app_out.jpg'
>>> im1.paste(im,(100,100))
>>> im1.save(outfile)
粘帖后的圖:
draft(草圖?):
>>> infile1='e:/doc/program/python/2.6/study/temp/freebsd.jpg'
>>> im1=Image.open(infile1)
>>> print im1.mode,im1.size
RGB (800, 600)
>>> outfile='e:/doc/program/python/2.6/study/temp/freebsd_out.jpg'
>>> im1.draft(mode='L',size=(120,100))
<JpegImagePlugin.JpegImageFile image mode=L size=200x150 at 0x286D990>
>>> print im1.mode,im1.size
L (200, 150)
>>> imout.save(outfile)
沒按我指定的size?
原圖同前
效果圖:
im.filter(filter) =>image
用給定的過濾器過濾
im.fromstring(data)
im.fromstring(data,decoder,parameters)
同fromstring函數,但是加載數據到當前圖像
im.getbands() bands這個詞太專業了,不懂,快速跳過。返回一個字符串元組,例如getbands在一個RGB圖像上返回("R","G","B")
im.getbbox() 返回4元組或者None。計算圖像非零區域的界限范圍
>>> infile1='e:/doc/program/python/2.6/study/temp/freebsd.jpg'
>>> im1=Image.open(infile1)
>>> result=im1.getbbox()
>>> result
(0, 72, 800, 600)
為什么這個800*600的圖返回的不是(0,0,800,600)呢?是因為上面部分接近或者是黑色了?
im.getdata() 以序列的方式返回圖像內容,序列對象是內部PIL數據類型,要轉換成普通序列要用list(im.getdata())
im.getextrema() 返回圖像的最小和最大值
>>> result=im1.getextrema()
>>> result
((0, 255), (0, 255), (0, 255))
當前版本僅僅應用於single-band圖像
im.getpixel(xy) 返回給定位置的像素,多層圖像則返回元組
>>> result=im1.getpixel((150,150))
>>> result
(3, 3, 3)
這個位置有3個像素?圖像知識太缺乏了
im.histogram() 返回圖像的柱狀圖(histogram),以像素數列表的方式返回,每個值是原圖像的像素值?多bands時還會連接起來。看不懂這種東西,繼續往下
>>> result=im1.histogram()
>>> result
[102456, 5040, 4490, 6720, 4930, 3975, 4296, 5587, 7128, 5951, 4099, 3737, 3177, 2959, ......]
>>> len(result)
768
還可以用mask做參數,具體要用時看手冊好了。太專業了基本上我用不到
im.load()
為圖像分配存儲,並從文件或來源加載。通常不需要調用這個方法,因為Image類會自動智能搞定的
im.offset(xoffset),yoffset) =>image
一個不贊成使用的方法,跳過
im.paste(image,box)
粘帖另一幅圖像image到這幅圖像im,前面有示例了
im.paste(colour,box)
作用同上,但是用單色來填充區域。多band圖像則傳遞元組參數
im.paste(image,box,mask)
還可以用mask參數來做一些更加復雜一點的操作
im.paste(colour,box,mask)
主要作用都差不多的,看看參數也大體明白是上面這些復雜的操作方式的混合運用
對圖片的像素點進行操作?
im.point(table)
im.point(function)
im.point(table,mode)
im.point(function,mode)
im.putalpha(band)
拷貝給定的band到當前圖像的alpha(透明?)層
im.putdata(data)
im.putdata(data,scale,offset)
從序列對象拷貝像素值到圖像
im.putpalette(sequence)
把一個調色板附加到"P"或"L"模式的圖像
im.putpixel(xy,colour)
修改給定位置的像素。這個方法相對比較慢
im.resize(size)
im.resize(size,filter)
調整圖像大小,filter可以是NEAREST,BILINEAR,BICUBIC
im.rotate(angle)
im.rotate(angle,filter)
按給定的角度逆時針旋轉圖像,filter可以是NEAREST,BILINEAR,BICUBIC
im.save(outfile,options)
im.save(outfile,format,options)
用給定的文件名保存圖像,format是格式參數
im.seek(frame)
在一個序列文件中尋找指定的幀,seek超過了序列結尾時產生EOFError異常。當一個序列文件被打開時,庫自動seek到第0幀,當前版本只允許做seek下一幀的操作
im.show()
顯示一幅圖像,這個方法主要是為調試目的設計的。在unix平台,這個方法保存文件到一個ppm臨時文件,然后調用xv工具來顯示。在windows平台,則保存到一個bmp臨時文件,然后使用標准的bmp顯示工具來顯示。方法返回None
im.split() =>sequence
不懂怎么翻譯,用個例子來試試看,對一個GRB圖像來操作:
>>> infile1='e:/doc/program/python/2.6/study/temp/freebsd.jpg'
>>> im=Image.open(infile1)
>>> im1,im2,im3=im.split()
>>> im1.save('e:/doc/program/python/2.6/study/temp/freebsd_out1.jpg')
>>> im2.save('e:/doc/program/python/2.6/study/temp/freebsd_out2.jpg')
>>> im3.save('e:/doc/program/python/2.6/study/temp/freebsd_out3.jpg')
infile1原圖前面有,得到的三張效果圖如下:
im.tell() =>integer
返回當前幀號
im.thumbnail(size)
im.thumbnail(size,filter)
修改圖像成縮略圖,除非速度比質量更重要,否則filter應該使用ANTIALIAS
im.tobitmap() =>string
返回被轉換成X11位圖的圖像
im.tostring() =>string
返回一個包含像素數據的字符串,未指定解碼器時則使用raw解碼器
im.tostring(encoder,parameters) =>string
變換:
im.transform(size,method,data)
im.transform(size,method,data,filter)
im.transform(size,EXTENT,data)
im.transform(size,EXTENT,data,filter)
im.transform(size,AFFINE,data)
im.transform(size,AFFINE,data,filter)
...太多了,要用時再看手冊
翻轉或旋轉圖像:
im.transpose(method)
method可以是Image.FLIP_LEFT_RIGHT......等等,實驗31里已經試過了
im.verify()
試圖確定文件是否有破碎損壞,而不會真的去解碼圖像數據。如果發現有任何問題則會產生適當的異常。如果需要檢驗后加載圖像則需要重新打開圖像文件。
屬性:
im.format
文件格式,用這個庫創建的圖像這個屬性設置為None
>>> infile1='e:/doc/program/python/2.6/study/temp/freebsd.jpg'
>>> im=Image.open(infile1)
>>> im.format
'JPEG'
im.mode
圖像模式
>>> im.mode
'RGB'
im.size
圖像尺寸,用像素表示
>>> im.size
(800, 600)
im.palette
色彩調色板表,如果有的話。其他情況用到時再看看手冊
im.info
跟圖像相關的數據,字典格式
>>> im.info
{'jfif': 258, 'jfif_unit': 0, 'adobe': 100, 'jfif_version': (1, 2), 'adobe_transform': 100, 'jfif_density': (100, 100)}