Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

Django Thumbnail Image

Django thumbnail imageを作成する。

def original_post_save_receiver(sender, instance, *args, **kwargs):
    if instance.image:
        processed_obj = OriginalImageProcessed.objects.create(original=instance)
        owner_slug = instance.slug
        media_path = instance.image.path
        filename = os.path.basename(media_path)
        basename, file_extension = filename.split(".")
        thumb = Image.open(media_path)
        size = (100, 100)
        thumb.thumbnail(size, Image.ANTIALIAS)

        temp_loc = "%s/%s/tmp" %(settings.MEDIA_ROOT, owner_slug)
        if not os.path.exists(temp_loc):
            os.makedirs(temp_loc)
        temp_file_path = os.path.join(temp_loc, filename)
        if os.path.exists(temp_file_path):
            temp_path = os.path.join(temp_loc, "%s" %(random.random()))
            os.makedirs(temp_path)
            temp_file_path = os.path.join(temp_path, filename)

        temp_image = open(temp_file_path, "w")
        thumb.save(temp_image,'JPEG')
        thumb_data = open(temp_file_path, "rb")

        thumb_file = File(thumb_data)
        processed_obj.image.save(filename, thumb_file)
        processed_obj.save()

post_save.connect(original_post_save_receiver, sender=Original)

ハマったポイント

  • thumb.save(temp_image) も、JPEGの拡張子をいれておかないと、keyerrorが発生してしまう。そのため、thumb.save(temp_image,'JPEG')というように、該当ファイルの拡張子を指定しておく。

  • thumb_data = open(temp_file_path, "r") だと、python3ではうまく読み込めない。(unicode errorが出る。)そのため、python3では、"rb"にする。