=== modified file 'phatch/other/tamogen.py' --- phatch/other/tamogen.py 2009-06-23 23:43:21 +0000 +++ phatch/other/tamogen.py 2009-06-24 05:35:00 +0000 @@ -26,6 +26,7 @@ # type by Juho Vepsäläinen. import glob, os, sys, Image, ImageChops +from itertools import izip from ImageStat import Stat IMAGE_ITSELF = 0 @@ -60,7 +61,7 @@ boxes.append('fill_box', (0, 0), fill_section_size) boxes.append('im_box', (0, 0), im_section_size) - fill_images = FillImages(fill_section_size) + fill_images = FillImages(fill_section_size, im.mode) if filltype == IMAGE_ITSELF: fill_images.append(im) @@ -86,12 +87,13 @@ return final_img class FillImages(list): - def __init__(self, fill_section_size): + def __init__(self, fill_section_size, mode): self.fill_section_size = fill_section_size + self.mode = mode super(FillImages, self).__init__() def append(self, item): - super(FillImages, self).append(FillImage(item, self.fill_section_size)) + super(FillImages, self).append(FillImage(item, self.fill_section_size, self.mode)) def findClosestImageAndToneDiff(self, cmp_img): if len(self) == 1: @@ -101,7 +103,7 @@ record_avg = sys.maxint for fill in self: - diff_image = ImageChops.difference(cmp_img.convert('RGBA'), fill.image) + diff_image = ImageChops.difference(cmp_img, fill.image) image_avg = sum(Stat(diff_image).mean) if image_avg < record_avg: @@ -114,17 +116,12 @@ return map(lambda x, y: x / max(y, 0.001), a, b) class FillImage(object): - def __init__(self, image, fill_section_size): - self.image = self._generateThumbnail(image, fill_section_size) - self.tone = get_tone(image) + def __init__(self, image, fill_section_size, mode): + self.image = self._generateThumbnail(image, fill_section_size, mode) + self.tone = get_tone(image.convert(mode)) - def _generateThumbnail(self, im, fill_section_size): - ret = im.resize(fill_section_size, Image.ANTIALIAS) - if ret.mode == 'P': - return ret.convert('RGBA') - if ret.mode == 'RGBA': - return ret - return ret.convert('RGB') + def _generateThumbnail(self, im, fill_section_size, mode): + return im.resize(fill_section_size, Image.ANTIALIAS).convert(mode) class BoundingBoxContainer(dict): def append(self, box_name, topleft, bottomright): @@ -200,15 +197,16 @@ def get_section_size(im_size, num_squares): def calculateSection(coord1, coord2): return int(round(coord1 / float(coord2))) - return [calculateSection(x, y) for (x, y) in zip(im_size, num_squares)] + return [calculateSection(x, y) for (x, y) in izip(im_size, num_squares)] def set_new_tone(fill_img, tone_diff, cur_fill_box, final_img): - temppix = [] - - for pixcol in fill_img.getdata(): - temppix.append(tuple([int(x * y) for (x, y) in zip(pixcol, tone_diff)])) - - fill_img.putdata(temppix) + temp_pix = [] + + for pix_col in fill_img.getdata(): + temp_pix.append(tuple([int(x * y) for (x, y) in izip(pix_col, tone_diff)])) + + fill_img.putdata(temp_pix) + if fill_img.mode == 'RGBA': final_img.paste(fill_img, (cur_fill_box.left, cur_fill_box.top), fill_img)