0

Add --optimize-img={1,2} -- performs postprocessing on images

This adds basic post-processing to images. At the moment, it only
performs actions for the png output type, but changes to work for
jpeg will be exceptionall minimal.
This commit is contained in:
Kyle Brantley
2010-10-09 22:57:20 -06:00
parent 05770468fb
commit bcb423ace4
3 changed files with 45 additions and 8 deletions

View File

@@ -24,10 +24,11 @@ import shutil
import collections
import json
import logging
import util
from PIL import Image
from optimizeimages import optimize_image
import util
"""
This module has routines related to generating a quadtree of tiles
@@ -55,7 +56,7 @@ def catch_keyboardinterrupt(func):
return newfunc
class QuadtreeGen(object):
def __init__(self, worldobj, destdir, depth=None, imgformat=None):
def __init__(self, worldobj, destdir, depth=None, imgformat=None, optimizeimg=None):
"""Generates a quadtree from the world given into the
given dest directory
@@ -67,6 +68,7 @@ class QuadtreeGen(object):
"""
assert(imgformat)
self.imgformat = imgformat
self.optimizeimg = optimizeimg
if depth is None:
# Determine quadtree depth (midpoint is always 0,0)
@@ -235,7 +237,8 @@ class QuadtreeGen(object):
# (even if tilechunks is empty, render_worldtile will delete
# existing images if appropriate)
yield pool.apply_async(func=render_worldtile, args= (tilechunks,
colstart, colend, rowstart, rowend, dest, self.imgformat))
colstart, colend, rowstart, rowend, dest, self.imgformat,
self.optimizeimg))
def _apply_render_inntertile(self, pool, zoom):
"""Same as _apply_render_worltiles but for the inntertile routine.
@@ -247,7 +250,7 @@ class QuadtreeGen(object):
dest = os.path.join(self.destdir, "tiles", *(str(x) for x in path[:-1]))
name = str(path[-1])
yield pool.apply_async(func=render_innertile, args= (dest, name, self.imgformat))
yield pool.apply_async(func=render_innertile, args= (dest, name, self.imgformat, self.optimizeimg))
def go(self, procs):
"""Renders all tiles"""
@@ -331,7 +334,7 @@ class QuadtreeGen(object):
pool.join()
# Do the final one right here:
render_innertile(os.path.join(self.destdir, "tiles"), "base", self.imgformat)
render_innertile(os.path.join(self.destdir, "tiles"), "base", self.imgformat, self.optimizeimg)
def _get_range_by_path(self, path):
"""Returns the x, y chunk coordinates of this tile"""
@@ -362,7 +365,7 @@ class QuadtreeGen(object):
return chunklist
@catch_keyboardinterrupt
def render_innertile(dest, name, imgformat):
def render_innertile(dest, name, imgformat, optimizeimg):
"""
Renders a tile at os.path.join(dest, name)+".ext" by taking tiles from
os.path.join(dest, name, "{0,1,2,3}.png")
@@ -452,12 +455,15 @@ def render_innertile(dest, name, imgformat):
img.save(imgpath, quality=95, subsampling=0)
else: # png
img.save(imgpath)
if optimizeimg:
optimize_image(imgpath, imgformat, optimizeimg)
with open(hashpath, "wb") as hashout:
hashout.write(newhash)
@catch_keyboardinterrupt
def render_worldtile(chunks, colstart, colend, rowstart, rowend, path, imgformat):
def render_worldtile(chunks, colstart, colend, rowstart, rowend, path, imgformat, optimizeimg):
"""Renders just the specified chunks into a tile and save it. Unlike usual
python conventions, rowend and colend are inclusive. Additionally, the
chunks around the edges are half-way cut off (so that neighboring tiles
@@ -586,6 +592,10 @@ def render_worldtile(chunks, colstart, colend, rowstart, rowend, path, imgformat
# Save them
tileimg.save(imgpath)
if optimizeimg:
optimize_image(imgpath, imgformat, optimizeimg)
with open(hashpath, "wb") as hashout:
hashout.write(digest)