我收到了一个要求,需要压缩文件大小小于500kb的所有上传图片。我在谷歌上搜索,看到的都是:
>>> foo = foo.resize((160,300),Image.ANTIALIAS)
>>> foo.save("path\\to\\save\\image_scaled.jpg",quality=95)
如果我采用这种方法,那么我将不得不在压缩后检查图像是否小于500kb,如果不是,则选择更低的质量和大小。有更好的方法吗?
我收到了一个要求,需要压缩文件大小小于500kb的所有上传图片。我在谷歌上搜索,看到的都是:
>>> foo = foo.resize((160,300),Image.ANTIALIAS)
>>> foo.save("path\\to\\save\\image_scaled.jpg",quality=95)
如果我采用这种方法,那么我将不得不在压缩后检查图像是否小于500kb,如果不是,则选择更低的质量和大小。class file_counter(object):
def __init__(self):
self.position = self.size = 0
def seek(self, offset, whence=0):
if whence == 1:
offset += self.position
elif whence == 2:
offset += self.size
self.position = min(offset, self.size)
def tell(self):
return self.position
def write(self, string):
self.position += len(string)
self.size = max(self.size, self.position)
质量
的代码。def smaller_than(im, size, guess=70, subsampling=1, low=1, high=100):
while low < high:
counter = file_counter()
im.save(counter, format='JPEG', subsampling=subsampling, quality=guess)
if counter.size < size:
low = guess
else:
high = guess - 1
guess = (low + high + 1) // 2
return low
我来提供我的代码,希望对遇到相同问题的人有所帮助。
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):
limit = 500000
img = Image.open(image.file)
width, height = img.size
ratio = float(width) / float(height)
quality = 100
while len(image.file.read()) > limit:
width -= 100
quality -= 10
height = int(width / ratio)
img.resize((width, height), Image.ANTIALIAS)
img.save(image.file.name, "JPEG", quality=quality)
image.file = open(image.file.name)
# reset the file pointer to the beginning so the while loop can read properly
image.file.seek(0)
return image
http://james.lin.net.nz/2012/11/19/django-snippet-reduce-image-size-during-upload/