<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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/"
	>
<channel>
	<title>Комментарии на: punypng</title>
	<atom:link href="http://chikuyonok.ru/2009/07/punypng/feed/" rel="self" type="application/rss+xml" />
	<link>http://chikuyonok.ru/2009/07/punypng/</link>
	<description>веб-разработчик</description>
	<pubDate>Sun, 01 Aug 2010 00:28:11 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>От: Майк</title>
		<link>http://chikuyonok.ru/2009/07/punypng/comment-page-2/#comment-1425</link>
		<dc:creator>Майк</dc:creator>
		<pubDate>Sat, 17 Oct 2009 19:20:14 +0000</pubDate>
		<guid isPermaLink="false">http://chikuyonok.ru/?p=407#comment-1425</guid>
		<description>Ни одно из сохранённых в Fireworks CS4 png ни улучшилось ни на чуть ))
Использую комбинацию optipng+advancecomp</description>
		<content:encoded><![CDATA[<p>Ни одно из сохранённых в Fireworks CS4 png ни улучшилось ни на чуть ))<br />
Использую комбинацию optipng+advancecomp</p>
]]></content:encoded>
	</item>
	<item>
		<title>От: Arris</title>
		<link>http://chikuyonok.ru/2009/07/punypng/comment-page-1/#comment-1186</link>
		<dc:creator>Arris</dc:creator>
		<pubDate>Thu, 03 Sep 2009 03:24:01 +0000</pubDate>
		<guid isPermaLink="false">http://chikuyonok.ru/?p=407#comment-1186</guid>
		<description>Почему-то этот великолепный http://pornel.net/imageoptim/en настоятельно указывает мне обновить ФФ2 на нелюбимый ФФ3.5 прямым редиректом на сайт мозиллы.

В ИЕ он почему-то этого не делает.</description>
		<content:encoded><![CDATA[<p>Почему-то этот великолепный <a href="http://pornel.net/imageoptim/en" rel="nofollow">http://pornel.net/imageoptim/en</a> настоятельно указывает мне обновить ФФ2 на нелюбимый ФФ3.5 прямым редиректом на сайт мозиллы.</p>
<p>В ИЕ он почему-то этого не делает.</p>
]]></content:encoded>
	</item>
	<item>
		<title>От: Ruslan</title>
		<link>http://chikuyonok.ru/2009/07/punypng/comment-page-1/#comment-1073</link>
		<dc:creator>Ruslan</dc:creator>
		<pubDate>Sat, 22 Aug 2009 11:45:56 +0000</pubDate>
		<guid isPermaLink="false">http://chikuyonok.ru/?p=407#comment-1073</guid>
		<description>da, imet' konsolnuyu versiyu bilo zamechatel'no, ya bi prikrutil k optimizatoru Data URI CSS Sprites http://duris.ru</description>
		<content:encoded><![CDATA[<p>da, imet&#8217; konsolnuyu versiyu bilo zamechatel&#8217;no, ya bi prikrutil k optimizatoru Data URI CSS Sprites <a href="http://duris.ru" rel="nofollow">http://duris.ru</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>От: Стас</title>
		<link>http://chikuyonok.ru/2009/07/punypng/comment-page-1/#comment-1057</link>
		<dc:creator>Стас</dc:creator>
		<pubDate>Sat, 15 Aug 2009 17:55:17 +0000</pubDate>
		<guid isPermaLink="false">http://chikuyonok.ru/?p=407#comment-1057</guid>
		<description>Я понимаю что это не ваша проблеа, но с казахстана (казахтелеком) негрузится http://www.punypng.com/ :(</description>
		<content:encoded><![CDATA[<p>Я понимаю что это не ваша проблеа, но с казахстана (казахтелеком) негрузится <a href="http://www.punypng.com/" rel="nofollow">http://www.punypng.com/</a> <img src='http://chikuyonok.ru/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>От: Heller</title>
		<link>http://chikuyonok.ru/2009/07/punypng/comment-page-1/#comment-1004</link>
		<dc:creator>Heller</dc:creator>
		<pubDate>Wed, 12 Aug 2009 08:35:32 +0000</pubDate>
		<guid isPermaLink="false">http://chikuyonok.ru/?p=407#comment-1004</guid>
		<description>нас на выставке тоже это больше всего заинтересовало. Жалко что народ на выставке был мало связан с технологами и поэтому многие не заметили ) ну или не поняли в чем моменты</description>
		<content:encoded><![CDATA[<p>нас на выставке тоже это больше всего заинтересовало. Жалко что народ на выставке был мало связан с технологами и поэтому многие не заметили ) ну или не поняли в чем моменты</p>
]]></content:encoded>
	</item>
	<item>
		<title>От: pJ</title>
		<link>http://chikuyonok.ru/2009/07/punypng/comment-page-1/#comment-1001</link>
		<dc:creator>pJ</dc:creator>
		<pubDate>Tue, 11 Aug 2009 13:42:47 +0000</pubDate>
		<guid isPermaLink="false">http://chikuyonok.ru/?p=407#comment-1001</guid>
		<description>BTW, этот самый "CQ", о котором я писал, содержит внутри: линейный алгоритм сжатия png, pngcrush и pngout. При записи выбирается лучший результат. Причем картинка пред-обрабатывается при передаче упаковщику, а pngout вызывается с кустомными ключами, которые CQ подобирает, анализируя картинку. У x128 есть мысль сделать из этого безобразия пакетную сжималку, но пока руки не дошли.</description>
		<content:encoded><![CDATA[<p>BTW, этот самый &#8220;CQ&#8221;, о котором я писал, содержит внутри: линейный алгоритм сжатия png, pngcrush и pngout. При записи выбирается лучший результат. Причем картинка пред-обрабатывается при передаче упаковщику, а pngout вызывается с кустомными ключами, которые CQ подобирает, анализируя картинку. У x128 есть мысль сделать из этого безобразия пакетную сжималку, но пока руки не дошли.</p>
]]></content:encoded>
	</item>
	<item>
		<title>От: Дмитрий Чаплинский</title>
		<link>http://chikuyonok.ru/2009/07/punypng/comment-page-1/#comment-965</link>
		<dc:creator>Дмитрий Чаплинский</dc:creator>
		<pubDate>Fri, 07 Aug 2009 13:18:43 +0000</pubDate>
		<guid isPermaLink="false">http://chikuyonok.ru/?p=407#comment-965</guid>
		<description>Ждем оффлайновой punypng :)</description>
		<content:encoded><![CDATA[<p>Ждем оффлайновой punypng <img src='http://chikuyonok.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>От: Сергей Чикуенок</title>
		<link>http://chikuyonok.ru/2009/07/punypng/comment-page-1/#comment-964</link>
		<dc:creator>Сергей Чикуенок</dc:creator>
		<pubDate>Fri, 07 Aug 2009 13:14:56 +0000</pubDate>
		<guid isPermaLink="false">http://chikuyonok.ru/?p=407#comment-964</guid>
		<description>Круто, спасибо :)</description>
		<content:encoded><![CDATA[<p>Круто, спасибо <img src='http://chikuyonok.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>От: Дмитрий Чаплинский</title>
		<link>http://chikuyonok.ru/2009/07/punypng/comment-page-1/#comment-963</link>
		<dc:creator>Дмитрий Чаплинский</dc:creator>
		<pubDate>Fri, 07 Aug 2009 13:06:41 +0000</pubDate>
		<guid isPermaLink="false">http://chikuyonok.ru/?p=407#comment-963</guid>
		<description>И за инлайновый python тоже пардон, что–то pastebin.ca не работает.</description>
		<content:encoded><![CDATA[<p>И за инлайновый python тоже пардон, что–то pastebin.ca не работает.</p>
]]></content:encoded>
	</item>
	<item>
		<title>От: Дмитрий Чаплинский</title>
		<link>http://chikuyonok.ru/2009/07/punypng/comment-page-1/#comment-962</link>
		<dc:creator>Дмитрий Чаплинский</dc:creator>
		<pubDate>Fri, 07 Aug 2009 13:05:58 +0000</pubDate>
		<guid isPermaLink="false">http://chikuyonok.ru/?p=407#comment-962</guid>
		<description>Как и обещал небольшой отчет по моим изысканиям:

Задача:
Найти наиболее оптимальный способ оптимизировать большое количество однотипных png изображений при помощи бесплатных утилит. Под оптимальным подразумевается хорошая эффективность сжатия + скорость работы.

Инструменты:
* pngOUT, последние доступная бинарная сборка под Mac OS (Apr 30 2007).
* optipng 0.6.3, собраная из последних исходников.
* pngcrush 1.7.0, собранная из последних исходников. 

Исходный материал — 991 png изображение с прозрачностью, используемое mydeco.com для работы Moodboard App (http://mydeco.com/rooms/moodboard/). Сами изображения — уменьшенные фотографии товаров с обрезанным (прозрачным) фоном.
Взять можно, например, отсюда:
http://mydeco.com/ws/search/search?db=product&amp;display=thumbnail_nobkg_270&amp;count=1000

Скачать себе можно при помощи простого скрипта на python + wget:
import os
import sys
import urllib2
import simplejson

response  = urllib2.urlopen("http://mydeco.com/ws/search/search?db=product&amp;display=thumbnail_nobkg_270&amp;count=1000").read()
data = simplejson.loads(response)

print "\n".join([item[1]['thumbnail_nobkg_270'] for item in data['results']['product']['items']])

Изначально изображений планировалось тысяча, но часть из них в выдаче дублировалась, поэтому после чистки осталось 991 общим весом в 72268kb.

Методика тестирования:
Сначала  каждая утилита запускалась с максимальными настройками перебора на указаном наборе изображений, с замером времени исполнения и объемом картинок после обработки. После этого логи optipng были пропарсены небольшим скриптом на пайтоне:
import os
import sys
import re
from operator import itemgetter

params = re.compile('Selecting parameters\:\s*(.*)IDAT', re.MULTILINE)

content = open('optipng.log').read()

mydict = {}
for match in params.finditer(content):
    line = match.group(1)
    mydict[line] = mydict.setdefault(line, 0) + 1

gen = mydict.iteritems()
test = sorted(gen, key=itemgetter(1), reverse=True)
for tup in test:
  print tup

чтобы получить наиболее частоиспользуемые параметры оптимизации из лога. После этого была проведена оптимизация при помощи optipng с использованием самого удачного набора параметров, комбинации двух самых удачных наборов и четырех самых удачных. 

Потом была проверена совместная работа optipng (комбинация двух параметров) + pngout по алгоритму указаному Павлом выше. Под конец, для очистки совести, был запущен брутфорс pngout поверх брутфорса optipng (что предсказуемо дало наилучший результат с наибольшими затратами времени).

Результаты ниже:
Original files:
Weight
	72268kb

OptiPNG bruteforce:
	find source/ -name "*.png" -print &#124; xargs  optipng -o7 --dir optipng --quiet -l optipng.log
Weight
	57700kb
Decrease
	20.15%
Time
	real	113m45.249s
	user	104m32.803s
	sys		5m28.420s

PNGCrush bruteforce:
	find source/ -name "*.png" -print &#124; xargs  pngcrush -rem alla -reduce -brute -d pngcrush &gt; pngcrush.log
Weight
	62464kb
Decrease
	13.56%
Time
	real	86m16.769s
	user	70m50.347s
	sys		7m29.228s

PNGOut bruteforce:
	for i in `find ./ -name "*.png" -print`; do pngout -y $i; done &gt; ../pngout.log
Weight
	55368kb
Decrease
	23.38%
Time
	real	57m14.420s
	user	53m58.410s
	sys		2m17.734s

OptiPNG one param:
	find source/ -name "*.png" -print &#124; xargs  optipng -zc=9 -zm=8 -zs=0  -f=5 --dir optipng_1 --quiet -l optipng_1.log
Weight
	58368kb
Decrease
	19.23%
Time
	real	3m47.360s
	user	2m59.876s
	sys		0m10.289s
	
OptiPNG two params:
	find source/ -name "*.png" -print &#124; xargs  optipng -zc=9 -zm=8 -zs=0-1  -f=5 --dir optipng_2 --quiet -l optipng_2.log
Weight
	57852kb
Decrease
	19.94%
Time
	real	5m29.486s
	user	4m30.160s
	sys		0m13.699s

OptiPNG four params:
	find source/ -name "*.png" -print &#124; xargs  optipng -zc=9 -zm=8-9 -zs=0-1  -f=5 --dir optipng_3 --quiet -l optipng_3.log
Weight
	57840kb
Decrease
	19.95%
Time
	real	8m56.324s
	user	7m27.380s
	sys		0m22.028s
	
OptiPNG two params + PNGOut:
	for i in `find ./ -name "*.png" -print`; do pngout -y -k0 -n2 -f5 $i; done &gt; ../opti-out1.log
Weight
	55500kb
Decrease
	23.20%
Time (+ to OptiPNG two params)
	real	52m32.620s
	user	47m36.084s
	sys		2m0.568s	
	
OptiPNG bruteforce + PNGOut bruteforce:
	for i in `find ./ -name "*.png" -print`; do pngout -y $i; done &gt; ../opti_out2.log
Weight
	55312kb
Decrease
	23.46%

Выводы:
В конкретно моем случае лидером выглядит оптимизация при помощи optipng используя комбинацию двух наиболее удачных наборов параметров сжатия, поскольку она дает вразумительный выигрыш при сжатии + справляется за короткое время. Таким образом, полученные параметры можно экстраполировать на все остальные изображения (несколько миллионов).

Наиболее качественно в плане сжатия отработала спарка optipng + pngout в «брутфорс» режиме. pngcrush предсказуемо оказался неинтересен. Вариант, предложенный Павлом, заметного выигрыша не дал.

Сорри за большой объем и корявый пайтон :)</description>
		<content:encoded><![CDATA[<p>Как и обещал небольшой отчет по моим изысканиям:</p>
<p>Задача:<br />
Найти наиболее оптимальный способ оптимизировать большое количество однотипных png изображений при помощи бесплатных утилит. Под оптимальным подразумевается хорошая эффективность сжатия + скорость работы.</p>
<p>Инструменты:<br />
* pngOUT, последние доступная бинарная сборка под Mac OS (Apr 30 2007).<br />
* optipng 0.6.3, собраная из последних исходников.<br />
* pngcrush 1.7.0, собранная из последних исходников. </p>
<p>Исходный материал — 991 png изображение с прозрачностью, используемое mydeco.com для работы Moodboard App (http://mydeco.com/rooms/moodboard/). Сами изображения — уменьшенные фотографии товаров с обрезанным (прозрачным) фоном.<br />
Взять можно, например, отсюда:<br />
<a href="http://mydeco.com/ws/search/search?db=product&amp;display=thumbnail_nobkg_270&amp;count=1000" rel="nofollow">http://mydeco.com/ws/search/search?db=product&amp;display=thumbnail_nobkg_270&amp;count=1000</a></p>
<p>Скачать себе можно при помощи простого скрипта на python + wget:<br />
import os<br />
import sys<br />
import urllib2<br />
import simplejson</p>
<p>response  = urllib2.urlopen(&#8221;http://mydeco.com/ws/search/search?db=product&amp;display=thumbnail_nobkg_270&amp;count=1000&#8243;).read()<br />
data = simplejson.loads(response)</p>
<p>print &#8220;\n&#8221;.join([item[1]['thumbnail_nobkg_270'] for item in data['results']['product']['items']])</p>
<p>Изначально изображений планировалось тысяча, но часть из них в выдаче дублировалась, поэтому после чистки осталось 991 общим весом в 72268kb.</p>
<p>Методика тестирования:<br />
Сначала  каждая утилита запускалась с максимальными настройками перебора на указаном наборе изображений, с замером времени исполнения и объемом картинок после обработки. После этого логи optipng были пропарсены небольшим скриптом на пайтоне:<br />
import os<br />
import sys<br />
import re<br />
from operator import itemgetter</p>
<p>params = re.compile(&#8217;Selecting parameters\:\s*(.*)IDAT&#8217;, re.MULTILINE)</p>
<p>content = open(&#8217;optipng.log&#8217;).read()</p>
<p>mydict = {}<br />
for match in params.finditer(content):<br />
    line = match.group(1)<br />
    mydict[line] = mydict.setdefault(line, 0) + 1</p>
<p>gen = mydict.iteritems()<br />
test = sorted(gen, key=itemgetter(1), reverse=True)<br />
for tup in test:<br />
  print tup</p>
<p>чтобы получить наиболее частоиспользуемые параметры оптимизации из лога. После этого была проведена оптимизация при помощи optipng с использованием самого удачного набора параметров, комбинации двух самых удачных наборов и четырех самых удачных. </p>
<p>Потом была проверена совместная работа optipng (комбинация двух параметров) + pngout по алгоритму указаному Павлом выше. Под конец, для очистки совести, был запущен брутфорс pngout поверх брутфорса optipng (что предсказуемо дало наилучший результат с наибольшими затратами времени).</p>
<p>Результаты ниже:<br />
Original files:<br />
Weight<br />
	72268kb</p>
<p>OptiPNG bruteforce:<br />
	find source/ -name &#8220;*.png&#8221; -print | xargs  optipng -o7 &#8211;dir optipng &#8211;quiet -l optipng.log<br />
Weight<br />
	57700kb<br />
Decrease<br />
	20.15%<br />
Time<br />
	real	113m45.249s<br />
	user	104m32.803s<br />
	sys		5m28.420s</p>
<p>PNGCrush bruteforce:<br />
	find source/ -name &#8220;*.png&#8221; -print | xargs  pngcrush -rem alla -reduce -brute -d pngcrush &gt; pngcrush.log<br />
Weight<br />
	62464kb<br />
Decrease<br />
	13.56%<br />
Time<br />
	real	86m16.769s<br />
	user	70m50.347s<br />
	sys		7m29.228s</p>
<p>PNGOut bruteforce:<br />
	for i in `find ./ -name &#8220;*.png&#8221; -print`; do pngout -y $i; done &gt; ../pngout.log<br />
Weight<br />
	55368kb<br />
Decrease<br />
	23.38%<br />
Time<br />
	real	57m14.420s<br />
	user	53m58.410s<br />
	sys		2m17.734s</p>
<p>OptiPNG one param:<br />
	find source/ -name &#8220;*.png&#8221; -print | xargs  optipng -zc=9 -zm=8 -zs=0  -f=5 &#8211;dir optipng_1 &#8211;quiet -l optipng_1.log<br />
Weight<br />
	58368kb<br />
Decrease<br />
	19.23%<br />
Time<br />
	real	3m47.360s<br />
	user	2m59.876s<br />
	sys		0m10.289s</p>
<p>OptiPNG two params:<br />
	find source/ -name &#8220;*.png&#8221; -print | xargs  optipng -zc=9 -zm=8 -zs=0-1  -f=5 &#8211;dir optipng_2 &#8211;quiet -l optipng_2.log<br />
Weight<br />
	57852kb<br />
Decrease<br />
	19.94%<br />
Time<br />
	real	5m29.486s<br />
	user	4m30.160s<br />
	sys		0m13.699s</p>
<p>OptiPNG four params:<br />
	find source/ -name &#8220;*.png&#8221; -print | xargs  optipng -zc=9 -zm=8-9 -zs=0-1  -f=5 &#8211;dir optipng_3 &#8211;quiet -l optipng_3.log<br />
Weight<br />
	57840kb<br />
Decrease<br />
	19.95%<br />
Time<br />
	real	8m56.324s<br />
	user	7m27.380s<br />
	sys		0m22.028s</p>
<p>OptiPNG two params + PNGOut:<br />
	for i in `find ./ -name &#8220;*.png&#8221; -print`; do pngout -y -k0 -n2 -f5 $i; done &gt; ../opti-out1.log<br />
Weight<br />
	55500kb<br />
Decrease<br />
	23.20%<br />
Time (+ to OptiPNG two params)<br />
	real	52m32.620s<br />
	user	47m36.084s<br />
	sys		2m0.568s	</p>
<p>OptiPNG bruteforce + PNGOut bruteforce:<br />
	for i in `find ./ -name &#8220;*.png&#8221; -print`; do pngout -y $i; done &gt; ../opti_out2.log<br />
Weight<br />
	55312kb<br />
Decrease<br />
	23.46%</p>
<p>Выводы:<br />
В конкретно моем случае лидером выглядит оптимизация при помощи optipng используя комбинацию двух наиболее удачных наборов параметров сжатия, поскольку она дает вразумительный выигрыш при сжатии + справляется за короткое время. Таким образом, полученные параметры можно экстраполировать на все остальные изображения (несколько миллионов).</p>
<p>Наиболее качественно в плане сжатия отработала спарка optipng + pngout в «брутфорс» режиме. pngcrush предсказуемо оказался неинтересен. Вариант, предложенный Павлом, заметного выигрыша не дал.</p>
<p>Сорри за большой объем и корявый пайтон <img src='http://chikuyonok.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
</channel>
</rss>
