浏览 8559 次
锁定老帖子 主题:Python图形图像处理(使用PIL)
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-01-05
最后修改:2009-01-05
Python是一个神奇的语言,上手极快,而且可以找到很多写的非常优秀的模块。这几天在给单位做CSS Sprites时,需要将一些图片先进行缩略,然后拼成一张大图,这样虽然数据量的传输没有降低,但是可以减少链接请求数,从而提高WEB服务的速度。 一时没有找到顺手的图形处理工具,(photoshop, GIMP太专业,而且体积太大,如果为了处理几百张图片就要装,未免浪费)于是自己用python写了一个,其实我学习python一共花的时间不过5小时,关于pil中的使用方法大部分来自pil的handbook,不过很快就完成了任务,顺便记录一下。
思路很简单: 遍历一个文件夹中的所有指定格式的图片,并将其resize,最后将这些resize过的图片对象粘贴到一个大的image上,并保存。 新生成的大图有两种形式,一种是竖直排列,一种是水平排列。这两种我都做了一下。下面是代码: import Image import glob import os # vertical iconify the given image def viconify(path=".\\", ext="jpg", size=(16, 16)): src = path + "*." + ext mode = "RGBA" width = size[0] height = len(glob.glob(src))*size[1] target = Image.new(mode, (width, height)) currentHeight = 0 step = size[1] for infile in glob.glob(src): img = Image.open(infile) img = img.resize(size) if img.mode != mode: img = img.convert(mode) target.paste(img, (0, currentHeight)) currentHeight += step targetFile = "targetVer" + str(width) + "_" + str(height) + "." + ext print "target name = ", targetFile target.save(targetFile); # horizontal iconify the given image def hiconify(path=".\\", ext="jpg", size=(16,16)): f = path+"*."+ext mode = "RGBA" width = len(glob.glob(f))*size[0] height = size[1] target = Image.new(mode, (width, height)) currentLeft = 0 step = size[0] for infile in glob.glob(f): img = Image.open(infile) img = img.resize(size) if img.mode != mode: img = img.convert(mode) target.paste(img, (currentLeft,0)) currentLeft += step targetFile = "targetHor" + str(width) + "_" + str(height) + "." + ext print "target name = ", targetFile target.save(targetFile); # for test only hiconify("picLib3\\", "png", (32,32)) viconify("picLib3\\", "png", (32,32)) 要注意的地方就是最后两行的测试函数,我用的都是png图片,Jpg也做了测试,可以正常运行。其他的格式没有测试,如果有问题,可以讨论。我用的是skype的自带的一些icon做的测试,如果有侵权嫌疑,请及时通知,呵呵。 python就是简单,但是借助一些外部的包,就可以快速的完成很多需求。通过一些简单的例子,大概可以归纳出python的一些特点,而这些特点都是我个人感兴趣的所在,现在大概列一下,大家可以参考
我对javascript的函数式变成做了一些研究,发现它跟python有很多相似之处,同时js要简单一些。有机会把我学习javascript的函数式编程的一些体会也贴出来,今天就先睡觉了。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-01-08
楼主的快速学习能力和运用能力另人钦佩
|
|
返回顶楼 | |
发表时间:2009-01-08
blustc 写道 楼主的快速学习能力和运用能力另人钦佩
呵呵,其实不是我学得快,主要原因是python设计的太好,上手极快(如果对javascript之类的弱类型语言有些接触),而且有很多牛人和组织写的模块,函数库等。很适合做一些繁琐,没有顺手工具的工作。 |
|
返回顶楼 | |
发表时间:2009-01-08
用python真的很爽,学起来也非常快
|
|
返回顶楼 | |
发表时间:2009-04-20
楼主,您好,我是一名python新手。
我想请教个问题,如何在一段程序里,同时使用两个模块 并且第一个类处理图片后,第二个类接着处理,才进行保存? 一下是我测试的代码,请赐教下,感激不尽! import Image,ImageEnhance jay = Image.open("test.jpg") jay.thumbnail((800,600),Image.ANTIALIAS) enhancer = ImageEnhance.Color(jay) enhancer.enhance(1.5).save("new1.jpg") 这段代码总是报错 |
|
返回顶楼 | |
发表时间:2009-04-20
zjgzpc 写道 楼主,您好,我是一名python新手。
我想请教个问题,如何在一段程序里,同时使用两个模块 并且第一个类处理图片后,第二个类接着处理,才进行保存? 一下是我测试的代码,请赐教下,感激不尽! import Image,ImageEnhance jay = Image.open("test.jpg") jay.thumbnail((800,600),Image.ANTIALIAS) enhancer = ImageEnhance.Color(jay) enhancer.enhance(1.5).save("new1.jpg") 这段代码总是报错 1.代码我测了下,没有问题,可能出错的地方是你的图片本身有就没有800*600这么大。 2.在一段程序中使用两个模块,并且……,举个例子来说吧: 设有方法一(或者叫函数一)名叫A 输入为一个Image对象,输出为处理过的Image对象 方法二叫B 输入为一个Image对象,输出为处理过的Image对象 则可以这样使用: A(B(image)).save(filename); 其中,image是一个Image对象的引用,filename是一个新的文件名的字符串。 |
|
返回顶楼 | |
发表时间:2009-04-22
谢谢楼主的解答,问题已经解决了!
不过,这次又得请教您新问题了,关于ImageEnhance模块的问题,现在我需要调用此模块下的2个类,进行先后的处理,问题是,第一段代码的效果没有处理。代码如下,请朋友指证,谢谢。 import Image,ImageEnhance im = Image.open("image.jpg") im.thumbnail((190,160),Image.ANTIALIAS) enhancer = ImageEnhance.Color(im) enhancer.enhance(1.5) enhancer2 = ImageEnhance.Sharpness(im) enhancer2.enhance(1.0).save("new.jpg") |
|
返回顶楼 | |
发表时间:2009-04-23
zjgzpc 写道 enhancer.enhance(1.5) 这一句会返回一个Image对象的引用(类似于句柄的一个东西),在返回的引用上做save操作即可 比如: tempImg = enhancer.enhance(1.5) tempImg.save('temp.jpg') 就是说,你已经用加强器处理过一次了,不过你又把中间结果丢弃了。 |
|
返回顶楼 | |