Python和Java处理图片缩放,C#友情支持

十一月 27th, 2010 1,336 留下评论 阅读评论

终于又是周末,昨天居然把笔记本电源和鼠标忘在公司了,也好,今天就到公司玩吧,有暖气舒服,虽然没有晚饭吃,靠前几天抢来的一些零食充饥…回去吃方便面~

正题,我经常游玩,用数码相机拍不少照片,都是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

Categories: Java, Python, 百度 标签:, ,
  1. 六月 9th, 2012 21:09

    其实PIL基本上是用C写的,怎么能不快

    • 这样,看了下主要有个2个300k+的pyd是C写的,大概是最核心的部分吧,其余都是python的代码

  2. 一月 27th, 2011 13:31

    看好python

  3. madog | #地板
    十一月 29th, 2010 12:28

    @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);
    }

  4. 十一月 28th, 2010 11:25

    Java代码实现用graphics2d画图的,似乎有更快的方法

  5. 十一月 28th, 2010 11:23

    这个有点意思~python的底层是C语言实现的库,肯定比java快啊。

    • 恩,Python离OS还是蛮近的。graphics2d的话没研究过,不太会用=_=

  6. madog | #6
    十一月 28th, 2010 01:06

    不知道.Net效率如何……

    • 应该会比Java好一些,学长试一试呀!

      • madog | #7
        十一月 28th, 2010 23:35

        @ stariy
        但是一个问题是,就算我写出来,我要如何测试呢?你装VS吧,我给你src

        • 我装了VS2008,应该可以运行的,那拜托学长啦!

  7. 十一月 27th, 2010 19:31

    python版本的我也曾经写过 :-P

icon_wink.gif icon_neutral.gif icon_mad.gif icon_twisted.gif icon_smile.gif icon_eek.gif icon_sad.gif icon_rolleyes.gif icon_razz.gif icon_redface.gif icon_surprised.gif icon_mrgreen.gif icon_lol.gif icon_idea.gif icon_biggrin.gif icon_evil.gif icon_cry.gif icon_cool.gif icon_arrow.gif icon_confused.gif icon_question.gif icon_exclaim.gif