Python和Java处理图片缩放,C#友情支持
终于又是周末,昨天居然把笔记本电源和鼠标忘在公司了,也好,今天就到公司玩吧,有暖气舒服,虽然没有晚饭吃,靠前几天抢来的一些零食充饥…回去吃方便面~
正题,我经常游玩,用数码相机拍不少照片,都是4000 * 3000大小的,然后一般会挑选不错的上传的人人网上,这么大的照片传的太慢,先自己处理到800 * 600再上传,速度会快很多,于是就有了这个idea。
一开始用Java写了一个,JavaSE还真没接触过关于处理图片,基本就是靠百度啦,资料还是不少的。主要用的java.awt.Image,java.awt.image.BufferedImage和javax.imageio包里面的几个IO接口实现的,实现缩放图片,以jpg为例:
1 2 3 4 5 6 7 8 9 10 | Image image = ImageIO.read(InputStream is) int width = image.getWidth(null); int height = image.getHeight(null); newWidth, newHeight = someFunction(width, height) BufferedImage bufferedImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB); bufferedImage.getGraphics().drawImage( image.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH), 0, 0, null); ImageIO.write(bufferedImage, "JPEG", OutputStream os); |
运行效率:52张图片,每张图片平均大小:2.7M,共耗时:2分10秒,平均一张耗时:2.6秒
今天用Python的Image Library(即PIL)写了一下,试着比较看看,代码如下:
1 2 3 4 5 | im = Image.open(imagePath) w, h = im.getbbox()[2:] width, height= someFunction(w, h) im = im.resize((width, height)) im.save(newPath) |
很明显的,Python的代码精简轻巧,的确是一个亮点。当然最关心的还是运行效率了,结果大大出乎我的意料,Python以大优势获胜
运行效率:52张图片,每张图片平均大小:2.7M,共耗时:23秒,平均一张耗时:0.45秒
再从图片效果上看,Java版缩略图比Python版平均一张图片要小10KB左右,差了不多,一张图片基本在100KB左右,图片效果上Python版的要比Java版的更加清晰一点,比较明显的,当然因为压缩后的锯齿什么的也同时清晰了= =
可以说在效果上基本平分秋色,Java以大小换效果,Python更注重图片效果,但是在处理速度上毫无疑问Python获胜。简单分析下原因:Java用的方法估计太烂,用的是基本都快被抛弃的awt包,或许有其他方法或专业的第三方库会好得多,而同时Python基本上可以说是官方统一的图片处理库,重视度就不一样;另一方便,这段程序明显是IO主要型的,Java基于虚拟机这一机制注定在IO上是悲剧的,好比写某些ACM你一个scanner扫描一遍就超时了,而Python,从Perl这样的字符串处理语言发展过来,以脚本为擅长,IO性能必然优秀。
总的感觉,拿着Java的劣势在拼Python的优势,不能因此就BS Java哈,偶们Java注重的是业务逻辑,是计算!不过也从另外一方面说明的Python的强大,不仅在于编程,效率和效果也相当不错!不知道C和C++又会是怎样的结果,当然编程的复杂是必须的,LZ不擅长也不会 = =
————————————-2010-11-30 感谢Madog提供C#代码————————————-
本来以为C#这么庞大的类似Java的感觉,会比Java快但或许会比Python慢,试了一下出乎意料了。环境是Win7 + VS2008。
先贴代码,C#的也很精简方便,基本就靠一个System.Drawing.Bitmap就搞定了,C#很强大啊!
1 2 3 4 | Bitmap srcBmp = new Bitmap(srcPath); int newHeight = srcBmp.Height * newWidth / srcBmp.Width; Bitmap bmp = new Bitmap(srcBmp, newWidth, newHeight); bmp.Save(dstPath, ImageFormat.Jpeg); |
运行效率:52张图片,每张图片平均大小:2.7M,也耗时23秒,速度与Python持平,默认处理图像效果与Java差不多,压缩率比较大,图片大小比Python的小一些,不过这个在程序中可以自己控制,这儿就按默认处理了。
总结一下:
效率: Python = C# > Java
压缩后相同像素图片的大小:Python > C# = Java
压缩后相同像素图片的清晰度:Python > C# = Java
其实PIL基本上是用C写的,怎么能不快
这样,看了下主要有个2个300k+的pyd是C写的,大概是最核心的部分吧,其余都是python的代码
看好python
@stariy
static void pictureResize(string srcPath, string dstPath, int newWidth, int newHeight)
{
Bitmap bmp = new Bitmap(Bitmap.FromFile(srcPath), newWidth, newHeight);
bmp.Save(dstPath, ImageFormat.Jpeg);
}
Java代码实现用graphics2d画图的,似乎有更快的方法
这个有点意思~python的底层是C语言实现的库,肯定比java快啊。
恩,Python离OS还是蛮近的。graphics2d的话没研究过,不太会用=_=
不知道.Net效率如何……
应该会比Java好一些,学长试一试呀!
@ stariy
但是一个问题是,就算我写出来,我要如何测试呢?你装VS吧,我给你src
我装了VS2008,应该可以运行的,那拜托学长啦!
python版本的我也曾经写过
有用C和C++写过吗?效果怎么样的
@ stariy
木有,表示根本没考虑效率。