<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>-Flyぁ梦- &#187; PIL</title>
	<atom:link href="http://blog.11034.org/tag/pil/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.11034.org</link>
	<description></description>
	<lastBuildDate>Sun, 22 Jun 2025 08:59:05 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.2.38</generator>
	<item>
		<title>Python和Java处理图片缩放，C#友情支持</title>
		<link>http://blog.11034.org/2010-11/image_resize_in_java_and_python.html</link>
		<comments>http://blog.11034.org/2010-11/image_resize_in_java_and_python.html#comments</comments>
		<pubDate>Sat, 27 Nov 2010 11:15:02 +0000</pubDate>
		<dc:creator><![CDATA[-Flyぁ梦-]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[百度]]></category>
		<category><![CDATA[Csharp]]></category>
		<category><![CDATA[PIL]]></category>
		<category><![CDATA[图片处理]]></category>

		<guid isPermaLink="false">http://blog.stariy.info/?p=590</guid>
		<description><![CDATA[终于又是周末，昨天居然把笔记本电源和鼠标忘在公司了，也好，今天就到公司玩吧，有暖气舒服，虽然没有晚饭吃，靠前几 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>终于又是周末，昨天居然把笔记本电源和鼠标忘在公司了，也好，今天就到公司玩吧，有暖气舒服，虽然没有晚饭吃，靠前几天抢来的一些零食充饥&#8230;回去吃方便面~</p>
<p>正题，我经常游玩，用数码相机拍不少照片，都是4000 * 3000大小的，然后一般会挑选不错的上传的人人网上，这么大的照片传的太慢，先自己处理到800 * 600再上传，速度会快很多，于是就有了这个idea。<span id="more-590"></span></p>
<p>一开始用Java写了一个，JavaSE还真没接触过关于处理图片，基本就是靠百度啦，资料还是不少的。主要用的java.awt.Image，java.awt.image.BufferedImage和javax.imageio包里面的几个IO接口实现的，实现缩放图片，以jpg为例：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #003399;">Image</span> image <span style="color: #339933;">=</span> ImageIO.<span style="color: #006633;">read</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">InputStream</span> is<span style="color: #009900;">&#41;</span>
<span style="color: #000066; font-weight: bold;">int</span> width <span style="color: #339933;">=</span> image.<span style="color: #006633;">getWidth</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">int</span> height <span style="color: #339933;">=</span> image.<span style="color: #006633;">getHeight</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
newWidth, newHeight <span style="color: #339933;">=</span> someFunction<span style="color: #009900;">&#40;</span>width, height<span style="color: #009900;">&#41;</span>
<span style="color: #003399;">BufferedImage</span> bufferedImage <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BufferedImage</span><span style="color: #009900;">&#40;</span>newWidth, newHeight,
	<span style="color: #003399;">BufferedImage</span>.<span style="color: #006633;">TYPE_INT_RGB</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
bufferedImage.<span style="color: #006633;">getGraphics</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">drawImage</span><span style="color: #009900;">&#40;</span>
	image.<span style="color: #006633;">getScaledInstance</span><span style="color: #009900;">&#40;</span>newWidth, newHeight,
		<span style="color: #003399;">Image</span>.<span style="color: #006633;">SCALE_SMOOTH</span><span style="color: #009900;">&#41;</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
ImageIO.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span>bufferedImage, <span style="color: #0000ff;">&quot;JPEG&quot;</span>, <span style="color: #003399;">OutputStream</span> os<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>运行效率：<strong>52</strong>张图片，每张图片平均大小：<strong>2.7M</strong>，共耗时：<strong>2分10秒</strong>，平均一张耗时：<strong>2.6秒</strong></p>
<p>今天用Python的Image Library（即PIL）写了一下，试着比较看看，代码如下：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="python" style="font-family:monospace;">im <span style="color: #66cc66;">=</span> Image.<span style="color: #008000;">open</span><span style="color: black;">&#40;</span>imagePath<span style="color: black;">&#41;</span>
w<span style="color: #66cc66;">,</span> h <span style="color: #66cc66;">=</span> im.<span style="color: black;">getbbox</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span>:<span style="color: black;">&#93;</span>
width<span style="color: #66cc66;">,</span> height<span style="color: #66cc66;">=</span> someFunction<span style="color: black;">&#40;</span>w<span style="color: #66cc66;">,</span> h<span style="color: black;">&#41;</span>
im <span style="color: #66cc66;">=</span> im.<span style="color: black;">resize</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>width<span style="color: #66cc66;">,</span> height<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
im.<span style="color: black;">save</span><span style="color: black;">&#40;</span>newPath<span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>很明显的，Python的代码精简轻巧，的确是一个亮点。当然最关心的还是运行效率了，结果大大出乎我的意料，Python以大优势获胜</p>
<p>运行效率：<strong>52</strong>张图片，每张图片平均大小<strong>：2.7M</strong>，共耗时：<strong>23秒</strong>，平均一张耗时：<strong>0.45秒</strong></p>
<p>再从图片效果上看，Java版缩略图比Python版平均一张图片要小10KB左右，差了不多，一张图片基本在100KB左右，图片效果上Python版的要比Java版的更加清晰一点，比较明显的，当然因为压缩后的锯齿什么的也同时清晰了= =</p>
<p>可以说在效果上基本平分秋色，Java以大小换效果，Python更注重图片效果，但是在处理速度上毫无疑问Python获胜。简单分析下原因：Java用的方法估计太烂，用的是基本都快被抛弃的awt包，或许有其他方法或专业的第三方库会好得多，而同时Python基本上可以说是官方统一的图片处理库，重视度就不一样；另一方便，这段程序明显是IO主要型的，Java基于虚拟机这一机制注定在IO上是悲剧的，好比写某些ACM你一个scanner扫描一遍就超时了，而Python，从Perl这样的字符串处理语言发展过来，以脚本为擅长，IO性能必然优秀。</p>
<p>总的感觉，拿着Java的劣势在拼Python的优势，不能因此就BS Java哈，偶们Java注重的是业务逻辑，是计算！不过也从另外一方面说明的Python的强大，不仅在于编程，效率和效果也相当不错！不知道C和C++又会是怎样的结果，当然编程的复杂是必须的，LZ不擅长也不会 = =</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-2010-11-30 感谢Madog提供C#代码&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>本来以为C#这么庞大的类似Java的感觉，会比Java快但或许会比Python慢，试了一下出乎意料了。环境是Win7 + VS2008。</p>
<p>先贴代码，C#的也很精简方便，基本就靠一个System.Drawing.Bitmap就搞定了，C#很强大啊！</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;">Bitmap srcBmp <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Bitmap<span style="color: #008000;">&#40;</span>srcPath<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #6666cc; font-weight: bold;">int</span> newHeight <span style="color: #008000;">=</span> srcBmp<span style="color: #008000;">.</span><span style="color: #0000FF;">Height</span> <span style="color: #008000;">*</span> newWidth <span style="color: #008000;">/</span> srcBmp<span style="color: #008000;">.</span><span style="color: #0000FF;">Width</span><span style="color: #008000;">;</span>
Bitmap bmp <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Bitmap<span style="color: #008000;">&#40;</span>srcBmp, newWidth, newHeight<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
bmp<span style="color: #008000;">.</span><span style="color: #0000FF;">Save</span><span style="color: #008000;">&#40;</span>dstPath, ImageFormat<span style="color: #008000;">.</span><span style="color: #0000FF;">Jpeg</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></td></tr></table></div>

<p>运行效率：<strong>52</strong>张图片，每张图片平均大小<strong>：2.7M</strong>，也耗时<strong>23秒</strong>，速度与Python持平，默认处理图像效果与Java差不多，压缩率比较大，图片大小比Python的小一些，不过这个在程序中可以自己控制，这儿就按默认处理了。</p>
<p>总结一下：<br />
效率： Python = C# &gt; Java<br />
压缩后相同像素图片的大小：Python &gt; C# = Java<br />
压缩后相同像素图片的清晰度：Python &gt; C# = Java</p>
<h4  class="related_post_title">随便看一看</h4><ul class="related_post"><li>2010-10-30 -- <a target="_blank" href="http://blog.11034.org/2010-10/%e9%a6%99%e5%b1%b1%e7%ba%a2%e5%8f%b6.html" title="北京香山红叶">北京香山红叶</a></li><li>2010-09-13 -- <a target="_blank" href="http://blog.11034.org/2010-09/inception.html" title="观Inception《盗梦空间》iMax感">观Inception《盗梦空间》iMax感</a></li><li>2011-02-17 -- <a target="_blank" href="http://blog.11034.org/2011-02/baidu_shanghai.html" title="百度上研一日游&#038;沪杭高铁初体验">百度上研一日游&#038;沪杭高铁初体验</a></li><li>2013-02-28 -- <a target="_blank" href="http://blog.11034.org/2013-02/tianjin.html" title="寒假游，津门塘沽">寒假游，津门塘沽</a></li><li>2013-10-31 -- <a target="_blank" href="http://blog.11034.org/2013-10/hulu.html" title="hulu校招">hulu校招</a></li></ul><h4 class="related_post_title">看看 Java , Python , 百度 </h4><ul class="related_post"><li>2010-12-24 -- <a target="_blank" href="http://blog.11034.org/2010-12/java_scriptengine.html" title="Java用ScriptEngine解析脚本">Java用ScriptEngine解析脚本</a></li><li>2010-11-17 -- <a target="_blank" href="http://blog.11034.org/2010-11/python2x_first_impression.html" title="Python2.x的第一印象">Python2.x的第一印象</a></li><li>2016-09-09 -- <a target="_blank" href="http://blog.11034.org/2016-09/64bits_linux_arena_memory.html" title="64位Linux下Java进程堆外内存迷之64M问题">64位Linux下Java进程堆外内存迷之64M问题</a></li><li>2016-08-18 -- <a target="_blank" href="http://blog.11034.org/2016-08/java_concurrency_in_practice.html" title="读java concurrency in practice">读java concurrency in practice</a></li><li>2016-08-05 -- <a target="_blank" href="http://blog.11034.org/2016-08/thread_stop.html" title="线程清理">线程清理</a></li>]]></content:encoded>
			<wfw:commentRss>http://blog.11034.org/2010-11/image_resize_in_java_and_python.html/feed</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>
