人生不易且无趣,一起找点乐子吧。欢迎评论,和文章无关的也可以。
(写个新的系列,图片处理。名字是很高级,但是我们能做的很low,先打个预防针,别充满期望。不然会很难过......)
(你可以弄个相册啊,什么的。自己用代码处理处理发给女朋友。处理有风险,发图需谨慎,可能会让你再次恢复单身的贤者模式......)
(看完这个系列的东西,对于一些简单的图片处理就不需要再继续依赖于一些软件,自己搞搞就可以,看完这个系列,你能干什么?玩!嗯,也就停留在这个阶段了,哈哈,开始吧。)
我们知道python中有一个专门用来做图片处理的第三方库,PIL(python image library)。里面的类也好多,今天我们简单来说说他的其中一个最简单的类,Image。(对图片的基本操作,打开存储等,类比文件的打开、读取、保存就可以了。)
说下安装,虽然库的名字叫PIL,但是如果你pip的话,要pip install pillow。
算了,这些去查查就知道了。直接“审视”这个类吧。
首先最基本的:
一、Image.open()
Image.open()
参数是图片的相对路径,有点像文件的open方法,没什么不同之处。open方法会返回一个Image对象,这个对象还有自己的一些属性:format,size,mode等。可以用来查看图片的相关信息。
类似于这样:
属性的内容大家一看就知道吧。
二、对象的show方法:
当得到Image对象,我们就可以用im.show()来查看,自我感觉这个东西是没有用的哈,他会调用你计算机上的看图工具然后把它打开。(自行忽略......Let it go.)
三、对象的save方法:
当我们把一张图片处理完,我们就可以另存为另一个图片了。
im.save('2.jpg','JPEG')
首参是另存为的名字,后面的参数是保存格式(可省略,默认与原图相同)。
这里谈一下图片格式的转化。我们知道,图片的格式有很多,jpg,gif,PDF,png,bmp等等。其实之所以会分这么多的类别,原因就是他们的存储方式的不同,这也就是为什么我们有时候手动修改图片的扩展名,图片不能正常显示的原因。举个例子,比如我的一张图片是gif,你把扩展名改成了jpg。那么原来这张按gif的格式存储的图片,你现在要按jpg的方式读取,当然就有可能出错。
这时你就可以用Image的save方法尝试着去把图片改成你想要的格式。
四、thumbnail方法:
Image对象的其中一个方法,thumbnail。是,缩略图。我觉得这个大家应该能用到的不多。我们知道,当我们浏览网页时,会有许多的图片产生。我们也知道,图片相对文字,是要大很多的。(遥想公瑾当年......,不是啊,就前几年),你每次打开网页,屏幕上有个自动的“贪吃蛇”转圈的图标,盯上半个小时,“蛇”还在追他的尾巴。其实有些网页上会采用缩略图,因为它存储小,读取快,能更快地让用户接收到图片,不至于转半天图片没出来,去喷网络体验差。
使用的方法很简单:
im.thumbnail(size)
参数是大小,是个tuple类型,这个我不需要过多解释吧。im.thumbnail((200,200))。记得最后保存的时候,扩展名是.thumbnail。
五、crop方法:
这个也是对象的方法,如果你去百度翻译,应该能查出来个“收割”的意思,我觉得你就理解成剪切吧。这样好理解些。
box=(100, 100, 200, 200)#左 上 右 下
im = Image.open(file)
region = im.crop(box)
参数很有趣,还是个tuple类型。因为是剪切嘛,所以你要指定剪切的位置,是个矩形。我们知道图片的左上角是(0,0)原点位置,向右和向下分别是x,y的正方向。
我这里用了张白血球的图片,应该不会侵权吧:
假如我们想要剪切头的那部分,那就需要我们把参数矩形的参数写出来,分别是矩形的左边所对x轴,上面所对y,右面所对x,下面所对y。或者简单点,你的参数就是矩形的左上和右下的(x,y)坐标。
我这里测试了下;
差不多就是酱紫。(我没有想到白血球会死在我的键盘下)
六、paste方法:
对,就当粘贴就可以了(如果你没有明白这句话里“对”的含义,那我想你肯定不明白什么叫做“英语”)。来看下使用方法:
box=(100, 100, 200, 200)#左 上 右 下
region = im.crop(box)
im.paste(region,box)
假如说我们现在有了image对象im,还有刚刚剪切下来的image对象region。我们想把region贴到另一张图的某个位置。就可以用paste了。参数分别是,要粘贴的image对象,还有粘贴位置。这里要注意的是参数box的设置和上面一样,但是box矩形的大小,一定要和你粘贴的region相同,不然会出错。
像这样,因为后面那张图不太和谐,我就顺便用它挡住吧,充当马赛克了。(白血球我对不起你!)
七、resize方法:
这个就很简单了,就是修改图片的大小,直接用image对象的resize方法就好,参数仍旧是个tuple类型。标识长宽(像素)。也就是我们平常看到的图片大小:num x num
out = im.resize((2000,1250))
out.save('resize.jpg')
八、rotate方法:
旋转、跳跃、你闭着眼~。这个方法也很简单,望文生义就好了,就是起个旋转的功能。
你觉得很垃圾?随便的手机都可以?你错了,他的旋转不像手机那样只是给你换个观察视图,直接看图吧,不解释(嗷~抱歉,这里不是傲气,是无能为力,解释不清......):
im = Image.open(file)
out = im.rotate(45)
out.save('rotate.jpg')
参数是旋转度数,逆时针。
九、transpose方法:
这个包含着rotate的方法,功能又强大了几分。
im = Image.open(file)
#out = im.transpose(Image.FLIP_LEFT_RIGHT)
out = im.transpose(Image.FLIP_TOP_BOTTOM)
out.save('transpose.jpg')
来看看两种不同的展示吧:
这个可不是旋转180度哦,这个是上下颠倒。你懂我意思吧。(水中的倒影~~~ 这个解释好)
第二种:
这个也就不需要解释了吧。(镜中人?不确切......)
transpose的参数还有很多,我这里举了两个好展示的例子,其他大家想玩的查一查就出来了。
十、convert方法:
这个有趣,简单说就是,彩电变黑白。(一键回到 jie fang 前【这里我怕敏感词啦~~~~不是我不会写!!!】)
im = Image.open(file).convert('L')
im.save("L.jpg")
参数L是个类似灰度的东西。嗯,这个无所谓啦。看效果:
遗照般的存在。(白血球!!!!!)
十一、merge方法:
这个有些难理解,简单说下,我们知道大部分的图片是RGB形式的,(red,green,blue),图片的每个像素点呢,是由这三种颜色的不同量度来“调和”的,我这样说准确吗?每个色的取值范围是0~255.比如如果一个颜色是(255,0,0),那这个颜色就是红色。相应的green,blue类比就是了。如果是(255,255,255)那就是白色,(0,0,0)黑色。其他颜色也都是色素量值的不同罢了,这里当小科普吧。还有format是RGBA,多了一个维度,A是什么呢。他叫不透明度。注意“不”,也就是说如果A是255,那他和RGB没啥区别。如果是0,那就看不见了。如果是一半的数值,他就会是那种若隐若现的透明感。(你不在我不在,不知谁还在那种~)
好了我们说回来merge,翻译是合并,嗯,就意会吧。你直接用艺术的手段理解成“调色”也可以(笑)。
def merge(file):
im = Image.open(file)
r,g,b = im.split()
im = Image.merge('RGB',(b,g,r))
im.save('merge.jpg')
我这里写个类来说明用法,顺便说个split方法。这个东西大家应该常常用到,分割符嘛。经常用来分割字符串,来获得内部的值,这里也差不多。因为分割的是图片,这里分离出来的,你就当成RGB那三原色,分别赋值给rgb三个变量。
我们再看merge方法。他是Image类的方法,所以我说就把他理解成填充也是可以的,首参是图片格式,后面的tuple参数是格式对应的值,这里我们看下,我们的赋值是(b,g,r)。什么意思呢?对,也就是说,我们把图片里的原来用红色的地方,现在用b蓝来填充。原来蓝的地方呢,就用r红来填充。
有趣,看看效果:
鬼魅般的颜色。如果你对颜色的调配很了解,那就自己试着去玩玩看吧,没准能搞出自己的风格。
哈哈。
ok,Image类差不多介绍完了。后面的其他PIL的类,也会慢慢的写,我也是在一点点的学,欢迎大家交流。
后记:
括号内的内容是第二遍查看的时候添加,只为引起你阅读时的极度舒适。
(预知后事如何,且听下回分解。)
(下集见,不是,下篇文章见。)