Just a quick python snippet I written today to reduce the image size during upload
class PhotoField(forms.FileField, object): def __init__(self, *args, **kwargs): super(PhotoField, self).__init__(*args, **kwargs) self.help_text = "Images over 500kb will be resized to keep under 500kb limit, which may result in some loss of quality" def validate(self,image): if not str(image).split('.')[-1].lower() in ["jpg","jpeg","png","gif"]: raise ValidationError("File format not supported, please try again and upload a JPG/PNG/GIF file") def to_python(self, image): try: limit = 500000 num_of_tries = 10 img = Image.open(image.file) width, height = img.size ratio = float(width) / float(height) upload_dir = settings.FILE_UPLOAD_TEMP_DIR if settings.FILE_UPLOAD_TEMP_DIR else '/tmp' tmp_file = open(os.path.join(upload_dir, str(uuid.uuid1())), "w") tmp_file.write(image.file.read()) tmp_file.close() while os.path.getsize(tmp_file.name) > limit: num_of_tries -= 1 width = 900 if num_of_tries == 0 else width - 100 height = int(width / ratio) img.thumbnail((width, height), Image.ANTIALIAS) img.save(tmp_file.name, img.format) image.file = open(tmp_file.name) if num_of_tries == 0: break except: pass return image
Pingback: Python:Python image library, how to compress image into desired file size? – IT Sprite