Skip to content

Instantly share code, notes, and snippets.

@mamico
Last active July 15, 2016 20:19
Show Gist options
  • Save mamico/21dbd53fa5de68f3720065ed05dd89d1 to your computer and use it in GitHub Desktop.
Save mamico/21dbd53fa5de68f3720065ed05dd89d1 to your computer and use it in GitHub Desktop.
PNG filesize growth with plone.scale #1550
from PIL import Image
from StringIO import StringIO
logo='\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00T\x00\x00\x00g\x08\x03\x00\x00\x00\xa9[\x95\xf0\x00\x00\x01)PLTE\xff\xff\xff3\xcc3\x00f3\x17\x14\x11\xfe\xfe\xfeQOM\xc6\xc5\xc4@\xcf@\x8b\x8a\x88\xa9\xa7\xa6&# \x10p@41/\xf3\xfc\xf3f\xd9f\xd9\xf5\xd9Y\xd6Y\xf0\xf0\xf0\xcf\xe2\xd90\x83Y@\x8cf\xc0\xd9\xcdC@>M\xd2Ms\xdcs\xc5\xc4\xc3\xcd\xf2\xcd}{z`\xa0\x80\xf0\xf6\xf3\xe2\xe2\xe1\x8b\x89\x88\xd9\xf6\xd9\xa8\xa7\xa5\x80\xdf\x80\xe5\xf9\xe5PNL\x99\xe6\x99P\x96s\xd3\xd3\xd2\xef\xf5\xf2_][\x9a\x99\x97\x8d\xe2\x8dnlk\x98\xe5\x98\xe3\xe2\xe2\xa6\xe9\xa6\xf1\xfb\xf1\x7f\xdf\x7f\xdf\xec\xe5\xd0\xe3\xd9\xc0\xef\xc0?\xcf?e\xd8e\xb6\xb5\xb4\xf1\xf1\xf1\xf2\xfc\xf2\x80\xb3\x99p\xa9\x8d\xa0\xc6\xb3\xb3\xec\xb3`^\\ yM\xbf\xef\xbfB?=Y\xd5Y\xe5\xf8\xe5\x90\xbc\xa6\xe6\xf9\xe6\xbf\xd9\xcc\x9f\xc5\xb2\x99\xe5\x99\xcc\xf2\xccmlj\xd4\xd4\xd3%"\x1f\xe0\xec\xe6\xa5\xe8\xa5|zye\xd9eX\xd5X\xd8\xf5\xd8\xb0\xd0\xc0\xaf\xcf\xbf\xcb\xf1\xcb\x8b\xe2\x8b520L\xd2L\x8c\xe2\x8c\xb7\xb6\xb531.RPN\x99\x98\x96\xa5\xe9\xa5\xbe\xee\xbe\x8f\xbc\xa5r\xdcro\xa9\x8c\xf3\xedwW\x00\x00\x00\x19tEXtSoftware\x00Adobe ImageReadyq\xc9e<\x00\x00\x04\xf4IDATh\xde\xed\x98gC\xe38\x10\x86U\xec8.\t\xe9\x85\x14\x02$\x84\x90l\xe8\xbd\xc3\xb2\xcb\x02\xbb\xb0\xb7\xb7\xf5\xfa\xfd\xff\x1fq\xb2\xdc\x1dI\xb6C\xee\xcb\x1d\xef\x878\x92\xa5\xc73\xa3\xd1\xb8\x00\x10\xa9\xe5\x8b\xdb\xa7\'\x05\x12)O\x7f\xdd^,\x83g\xeb\xddf\x15\x86T\xdd\xbcx\x16r.\x0b\x99\xaa~\x9f\xde\xde[\xc8\xd7\xe6t\xd8\xc3\x1c\x14\xea\xfb\xe1\x14\xae+0BJ\xb2\xd8\xae\x96c0\x89\x96\x12\x18[8\x8a\xc7\x8407\x17\x9bYl\x81\x1c\x8c\'%&\xb5\xa0o\x83\x1e\x843\xa5\x16\xf4&8T\xe0L\xa9\x05\x1d\xbd\x07\xa7\x10\xce\x92\xbaz\x8e\x9a\x00\x0c\x93@a5*\x07V\x10:\x01 \x9b\x08\nkb\xe6k\x84P\x0b\x80Z\\\xdc\xd5\xb5tq\x05\xe1\xba\x88\xb9\xa5#tN\x8e\xa2\xc5Wj5w\x19\x95\rI\x926\xae\xa0"*\x04%bh\x89\x1co\x04\xb6\x99\x1c\xa7\xd2lJ\xa6\xae\x15Q\x00\xde \x1b\xca\xf7\x9f\xda&I\x1f\xac\xd6+\xda\x90\xbe@\xf8Nh\xa8\x05\xcd\xf0\x12\xd5\xb2M\x92\xb2~\xe85\x84Y\xa1\xa1H\xa7\xff;\x1c\xaa\x8d\x91\xfe\xa0\xad=\xbb\x05\xf9\xa6\xaeP(\xda\xb2\xa8U&\xf4\xb3\xe4q\x88\xac`H{\xdc\xb4\xda\xb2\x98f\x9e\xd2\x08\xe4D\x96\x9a\x1c\xaf\xb9K\xfe.ss\xd4\xd4\x8a\xd31\x14\xc4\xd4\x86\xee\xfed\xc7\x94\x97\xabE\x1bj\xfbO\xb43\x19\xd8]\xdba\xe9\xa3\xdd\xfe\xec\\ \'\xf2\x1e\xa1#\xb7/S\xe3\xf9\xbf\xe1v|\xfc\xf2\xcd\xfa\xc3\xf2\xff\xc4\x85z\xa6\xb2\x8c\xa5\x0eK\xaf&#s\xca\x80\x1e{\xd0\x15_w&\\\\v?x\xc9\x1f\xd0\x90\x97\xf9\xb6\xde\xfaO\xac\x87\x8d\xdd\xdd\xfb\xc6J\x0cV\xfe\xeb>\xa8^\xf0\x9f\xb9\x89Y\t\x19P\xe4\x97\xbe\x1a8\xb7>%\xb4\x10\x80\xa2b\x90\xda\x89sw\x9d\x9f\x80\x96\x91\x90\x1a\xe7\x0e\x13\rE\xe7\x85\xe0\x80\x1de\x06\xd0\xd0jqKL2h(\xb3x%&)\x145\x83\x81\xcd,%\x84n\xb3\xa0\xa8\x18\n\x81\x90\xda\x89\xc8S/\xb0\x7f\xc6\xa72\x92\xff\x9cME\xa5\xad\xc00~\\\xab\x11{?h\xec\xcf\x81\xb8rs\x80\xb5\xf7\x8f\x10W+\xfe\xf5\xea\xf0\xa0=\x06\xb4\xcc\x87\x06\x8d\x1d\xc6^|\xeeJM\x1a\xcb{&\x10\xdd\xa1y\xc6\xbe\x89\xa8Y\xec{\xf4\t\x12\xebo\xb1\xa9\xa7\xec\x1b\xbf\x1eAuw\x02+Y\x95\x0c\x1bz\x1c\x01uC\xb0\xc3z\xa5\xe2<\xf6\xbcG\x91\xb2JL\x86\x01\xbd\xe1=\xa15\xe3R\xe3\x1bJL\xd5\xa3\xa94\xae\x13wB\xe5\x86\xff\xd4{\x14\r-1\xa1=\xd1C\x7f1\x9e\xa9\xb9\x18\xb5$\xaa\xaa\x06t\xc4\x88i\'\xfa\x9dG,\xf2\xee6\x17b\xaeG\xbd\xf25c@\xd7\xe3\xae\xbc\xa3V1\xda\xfd`I\xcde\xc0\xb3\xa9\xdb\xa1\xd7\xe18\xcc(j)dh<&\xa1\x8a\x8a`9\xf8\x8eY\x8b\xc9\x14\x96\x96\xe3\xe0\xd2\x0f\x93|\xee\xf9\xa4\xf3\x9c\xf7\x7f\xb1Qv\x92}\x95j1S\xab\xd8Z\xf6m\xa6\xa5\x0cH\xaa\xf2\xe4z5[>;\xb3\xf3S}\x97+\x87\x1e\x05^\x83\xdf\x95g"i)8\xf6b[\xda^v\x8a\x932\xec<\xef\x03j\xf9\x98\x86\xe1\xfcdn\xd3N\xcc\xde<\x98\x85\xb6?\x95\x0fO\xb3\xd9Z\xaf\xb7\xd3\x01/z\xd1\x8b\xfekZ\\\x88;R\xc6`\xf6C\x13@\x1b\xf2\xbf\x00\x05\xe0\x7f\x08\xad\xcb\x18c\xc3\\\xf8\xc7\xae\xd9\xee.\xe6\x1f5\x8c\x07}\x90\xbf#g\x06m\xb3\xb3\xdf\xed\xb7\x07\xa4U\xd9\xf7C\xf3\x0b\x86\xd7\xb7\xd8\x05\xfd\n\xa6\x13A\x1d\x1b\xe9\x94\xda\x18\xb9CqZ6\xd6R\r\xcd\xc8W\xc81\xadiy\xd2\x99\xc2?4Y%-\xbc\xe8A\xf3\x15,\x93\x11\x066\'\x834\xeek#\x95L\xd4\xda\xe0\x0c\x1f\x04\x9d\xc2_+f\x8f\x8a\x7f5\x0e(n\x8d\xfe~=3O\xb65\xdcvG\xca\xd6\x15\x08{\x9fB+*\xa0\x13\x1b@\x96C\x91\xc28\x05\xac\xe3\x0fz\xd4d\n\xc5y\xcbI2\xc5\x1eY\xc7g\xd6\xbc\xbcfXP\xabi\x18\xc4\xd2z\x08\xaa\xd9\xe7\xec\xc5\x90-\xe8\xc0\x06`\xd9\x19\xd9\xc0\xfb\xf6\xc4;\xdc7\xa1i\x1736\xb0\\\x0f@e\x1f\xcc\x83:[X\xc3\xceH/\x05~3C\x94\xb6=\xa4\xfd\x07\r\x8c\xe5v$\xd4\xb1\xaa\xeb\xf2\x0c\x17Z7\x8d\x0c@\x01\x18\x8f\xb0\xb6\x1f\x05]\x9c\x80V\x84P2\x87&N,\xf7\xb1\xe1\xb9\x9f\xb7\xfb\x16\xb0\xca\x80Z=B\xe8\xa5\xd5j\xd3%\xa7#\xd3\xae\xf5\x97x<\x1d\xd4N\x12j\x945r\x8c\x7fq\xbc\x97A\x10j\xedB\xcd\xbc\x96\x10*_\xb6i\x9aV<c\x1a\xf8\xce\x0c@\xfd\x01\xdf\x87\xa0\xd8\x18,t\xb1w}\x1e4%?\x0c\x16.\xb1q\xef\xf3p\x84\x1f\xba\x8f\x97X\xbb\x07!\xa8:\x92e\xb91\xa6\x1b\x8cfoZ\xb5\xce\xa9\xfe#\x81\x02\x95\x0c\\\xb3\xf6\xb4j\xe7yj\xe4\xf5\xa5\xd2c\x108\x19\xa9\x94c\xc6,\xf5\x02M0\xfa\x1fU\xfan\xc4\x13!\'\x8c\x00\x00\x00\x00IEND\xaeB`\x82'
print len(logo)
# 1671
# save noop :(
im = Image.open(StringIO(logo))
logo2 = StringIO()
im.save(logo2, im.format)
print len(logo2.getvalue())
# 2142
# save optimize :|
im = Image.open(StringIO(logo))
logo2 = StringIO()
im.save(logo2, im.format, optimize=True)
print len(logo2.getvalue())
# 2105
# save optimize, progessive :|
im = Image.open(StringIO(logo))
logo2 = StringIO()
im.save(logo2, im.format, optimize=True, progressive=True)
print len(logo2.getvalue())
# 2105
# save optimize, progessive, quality=88 :((
im = Image.open(StringIO(logo))
logo2 = StringIO()
im.save(logo2, im.format, optimize=True, progressive=True, quality=88)
print len(logo2.getvalue())
# 4210
# current plone.scale's way:
# change to RGBA, optimize, progressive, quality=88 :(((
im = Image.open(StringIO(logo))
logo2 = StringIO()
if im.mode == "P":
im = im.convert("RGBA")
im.save(logo2, 'PNG', optimize=True, progressive=True, quality=88)
print len(logo2.getvalue())
# 8901
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment