| @@ -175,7 +175,9 @@ class ImageThumbnailsPlugin(Plugin): | |||||
| which means - make from every picture two thumbnails with different prefixes | which means - make from every picture two thumbnails with different prefixes | ||||
| and sizes | and sizes | ||||
| If both width and height defined, crops image. | |||||
| If both width and height defined, image would be cropped, you can define | |||||
| crop_type as one of these values: "topleft", "center" and "bottomright". | |||||
| "topleft" is default. | |||||
| Currently, only supports PNG and JPG. | Currently, only supports PNG and JPG. | ||||
| """ | """ | ||||
| @@ -183,7 +185,7 @@ class ImageThumbnailsPlugin(Plugin): | |||||
| def __init__(self, site): | def __init__(self, site): | ||||
| super(ImageThumbnailsPlugin, self).__init__(site) | super(ImageThumbnailsPlugin, self).__init__(site) | ||||
| def thumb(self, resource, width, height, prefix): | |||||
| def thumb(self, resource, width, height, prefix, crop_type): | |||||
| """ | """ | ||||
| Generate a thumbnail for the given image | Generate a thumbnail for the given image | ||||
| """ | """ | ||||
| @@ -212,7 +214,14 @@ class ImageThumbnailsPlugin(Plugin): | |||||
| im = im.resize((resize_width, resize_height), Image.ANTIALIAS) | im = im.resize((resize_width, resize_height), Image.ANTIALIAS) | ||||
| if width is not None and height is not None: | if width is not None and height is not None: | ||||
| im = im.crop((0, 0, width, height)) | |||||
| shiftx = shifty = 0 | |||||
| if crop_type == "center": | |||||
| shiftx = (im.size[0] - width)/2 | |||||
| shifty = (im.size[1] - height)/2 | |||||
| elif crop_type == "bottomright": | |||||
| shiftx = (im.size[0] - width) | |||||
| shifty = (im.size[1] - height) | |||||
| im = im.crop((shiftx, shifty, width + shiftx, height + shifty)) | |||||
| im.load() | im.load() | ||||
| if resource.name.endswith(".jpg"): | if resource.name.endswith(".jpg"): | ||||
| @@ -228,6 +237,7 @@ class ImageThumbnailsPlugin(Plugin): | |||||
| config = self.site.config | config = self.site.config | ||||
| defaults = { "width": None, | defaults = { "width": None, | ||||
| "height": None, | "height": None, | ||||
| "crop_type": "topleft", | |||||
| "prefix": 'thumb_'} | "prefix": 'thumb_'} | ||||
| if hasattr(config, 'thumbnails'): | if hasattr(config, 'thumbnails'): | ||||
| defaults.update(config.thumbnails) | defaults.update(config.thumbnails) | ||||
| @@ -242,6 +252,10 @@ class ImageThumbnailsPlugin(Plugin): | |||||
| prefix = th.prefix if hasattr(th, 'prefix') else defaults['prefix'] | prefix = th.prefix if hasattr(th, 'prefix') else defaults['prefix'] | ||||
| height = th.height if hasattr(th, 'height') else defaults['height'] | height = th.height if hasattr(th, 'height') else defaults['height'] | ||||
| width = th.width if hasattr(th, 'width') else defaults['width'] | width = th.width if hasattr(th, 'width') else defaults['width'] | ||||
| crop_type = th.crop_type if hasattr(th, 'crop_type') else defaults['crop_type'] | |||||
| if crop_type not in ["topleft", "center", "bottomright"]: | |||||
| self.logger.error("Unknown crop_type defined for node [%s]" % node) | |||||
| continue | |||||
| if width is None and height is None: | if width is None and height is None: | ||||
| self.logger.error("Both width and height are not set for node [%s]" % node) | self.logger.error("Both width and height are not set for node [%s]" % node) | ||||
| continue | continue | ||||
| @@ -251,4 +265,4 @@ class ImageThumbnailsPlugin(Plugin): | |||||
| thumbs_list.append(path) | thumbs_list.append(path) | ||||
| for resource in node.resources: | for resource in node.resources: | ||||
| if resource.source_file.kind in ["jpg", "png"] and resource.path in thumbs_list: | if resource.source_file.kind in ["jpg", "png"] and resource.path in thumbs_list: | ||||
| self.thumb(resource, width, height, prefix) | |||||
| self.thumb(resource, width, height, prefix, crop_type) | |||||