views:

769

answers:

2

I want to generate 32x32 sized thumbnails from uploaded images (actually avatars).

To prevent a thumbnail from being smaller than that size, I want to create a transparent 32x32 background and paste the thumbnail on it.

The code below tries to do so. However, the avatar is displayed on a black and opaque background; I lose transparency information somewhere through the process. Where am I doing wrong?

def handle_image(img):
    size = SMALL_AVATAR_IMAGE_SIZE
    img.thumbnail(size, Image.ANTIALIAS)  
    img = img.convert('RGBA')
    background = Image.new('RGBA', size, (255, 255, 255, 0))
    background.paste(img, (0, (size[1] - img.size[1]) / 2), img)
    img = background
    processed_image_small = ContentFile(img.tostring('jpeg', img.mode))
    targetpath = str(self.user.id) + '_S' + '.jpg'
    self.img_small.save(targetpath, processed_image_small,save=False)
+4  A: 

You're generating a JPG image. JPEGs don't support background transparency. You need to generate a PNG image to support transparencies.

Soviut
+5  A: 

That is because JPEG cannot save transparency informations which are contained in a RGBA image. You may want to save the avatar to a format like PNG which is able to keep these informations.

Pierre Bourdon