/usr/share/pyshared/TileCache/Layers/Image.py is in tilecache 2.11-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | # BSD Licensed, Copyright (c) 2006-2010 TileCache Contributors
from TileCache.Layer import MetaLayer
class Image(MetaLayer):
"""The ImageLayer allows you to set up any image file in TileCache.
All you need is an image, and a geographic bounds (filebounds),
Which is passed in as a single, comma seperated string in the form
minx,miny,maxx,maxy."""
config_properties = [
{'name':'name', 'description': 'Name of Layer'},
{'name':'file', 'description': 'Location of PIL-readable file.'},
] + MetaLayer.config_properties
def __init__ (self, name, file = None, filebounds = "-180,-90,180,90",
transparency = False, scaling = "nearest", **kwargs):
import PIL.Image as PILImage
MetaLayer.__init__(self, name, **kwargs)
self.file = file
self.filebounds = map(float,filebounds.split(","))
self.image = PILImage.open(self.file)
self.image_size = self.image.size
self.image_res = [(self.filebounds[2] - self.filebounds[0]) / self.image_size[0],
(self.filebounds[3] - self.filebounds[1]) / self.image_size[1]
]
self.scaling = scaling.lower()
if isinstance(transparency, str):
transparency = transparency.lower() in ("true", "yes", "1")
self.transparency = transparency
def renderTile(self, tile):
import PIL.Image as PILImage
import StringIO
bounds = tile.bounds()
size = tile.size()
min_x = (bounds[0] - self.filebounds[0]) / self.image_res[0]
min_y = (self.filebounds[3] - bounds[3]) / self.image_res[1]
max_x = (bounds[2] - self.filebounds[0]) / self.image_res[0]
max_y = (self.filebounds[3] - bounds[1]) / self.image_res[1]
if self.scaling == "bilinear":
scaling = PILImage.BILINEAR
elif self.scaling == "bicubic":
scaling = PILImage.BICUBIC
elif self.scaling == "antialias":
scaling = PILImage.ANTIALIAS
else:
scaling = PILImage.NEAREST
crop_size = (max_x-min_x, max_y-min_y)
if min(min_x, min_y, max_x, max_y) < 0:
if self.transparency and self.image.mode in ("L", "RGB"):
self.image.putalpha(PILImage.new("L", self.image_size, 255));
sub = self.image.transform(crop_size, PILImage.EXTENT, (min_x, min_y, max_x, max_y))
else:
sub = self.image.crop((min_x, min_y, max_x, max_y));
if crop_size[0] < size[0] and crop_size[1] < size[1] and self.scaling == "antialias":
scaling = PILImage.BICUBIC
sub = sub.resize(size, scaling)
buffer = StringIO.StringIO()
if self.image.info.has_key('transparency'):
sub.save(buffer, self.extension, transparency=self.image.info['transparency'])
else:
sub.save(buffer, self.extension)
buffer.seek(0)
tile.data = buffer.read()
return tile.data
|