请注意,对于Google索引的每张图片,缩略图都有一个小缩略图。
这些缩略图是:
大小小于10KB。
宽度/高度的比例与原始图像中的比例相同。
我想编写一个函数(在python中),该函数将拍摄图像并使用属性创建一个缩略图。
编辑:
因此,现在有3个答案,而所有答案都是正确的一半。
我需要一个函数,不仅要按比例调整图像大小,还要确保文件大小小于10KB。 我怎么做?
重复:stackoverflow.com/questions/273946/
这不是重复的! 就像我现在在"编辑"中所说的那样,我需要一个不仅要按比例调整图像大小的函数,而且还需要确保该大小小于10KB。
在这篇简短的文章中,Mike Fletcher和effbot展示(并讨论了详细的变体)一种出色的方法来完成您要完成的任务。
编辑:对于10K的要求,很难(至少可以说-)根据图像的格式来预测图像的压缩程度,因为当今的压缩算法是如此微妙。如果您希望缩略图在满足<10K要求的前提下尽可能大(以像素为单位),则可能必须使用"反复试验"的方法,对缩放因子进行逐次更精确的猜测,直到达到可接受的结果。
例如,这是一种"二进制搜索"方法,用于获取正确的大小(可能会有更好的策略!),并带有足够的打印语句&c来解释正在发生的事情...:
import Image
import cStringIO
import math
import os
import stat
# try no more than 10 times, then give up
MAX_TRIES = 10
def getThumbnail(filename, max_bytes=(10*1024)):
'''Get a thumbnail image of filename,
original_size = os.stat(filename)[stat.ST_SIZE]
print"Original file size: %.1f KB" % (original_size/1024.)
image = Image.open(filename)
image.load()
print"Original image size: %dx%d pixels" % image.size
min_bytes = int(0.9 * max_bytes)
largest_side = max(image.size)
smallest_side = 16
for attempt in range(MAX_TRIES):
try_side = (largest_side + smallest_side) / 2
print"Attempt #%d of %d" % (attempt+1, MAX_TRIES)
print"Side must be within [%d:%d], now trying %d" % (
smallest_side, largest_side, try_side)
thumb = image.copy()
thumb.thumbnail((try_side,try_side), Image.ANTIALIAS)
afile = cStringIO.StringIO()
thumb.save(afile,"PNG")
resulting_size = len(afile.getvalue())
afile.close()
print"Reduced file size: %.1f KB" % (resulting_size/1024.)
print"Reduced image size: %dx%d pixels" % thumb.size
if min_bytes <= resulting_size <= max_bytes:
print"Success!"
return thumb
elif resulting_size > max_bytes:
print"Too large (>%d), reducing more" % max_bytes
largest_side = try_side
else:
print"Too small (
smallest_side = try_side
print"too many attempts, returning what I've got!"
return thumb
def main():
thumb = getThumbnail("pyth.png")
print"Reduced image size: %dx%d pixels" % thumb.size
print"Saving to thumb.png"
thumb.save("thumb.png")
thumb_size = os.stat("thumb.png")[stat.ST_SIZE]
print"Reduced file size: %.1f KB" % (thumb_size/1024.)
print"Done, bye!"
if __name__ == '__main__':
main()
使用PIL,请参见此处的示例代码以调整尺寸以保持宽高比
如何使用PIL调整图像大小并保持其长宽比?
看看如何在目录上做类似的事情
调整目录中的图像大小
因此,上面的链接描述了如何使用PIL调整图像大小,现在您遇到的最大大小为10KB的问题可以轻松实现,例如
假设所需大小为100x100,并且我们使用JPEG压缩,则100%JPEG质量需要每像素9位(请参阅http://en.wikipedia.org/wiki/JPEG),这意味着100x100图片的大小为100x100x9 /( 1024x8)= 11KB,因此在quality = 100时,您几乎可以实现目标,但是如果您仍然只希望10KB,则可以将quality = 90设置为一般值,并且可以将quality作为参数传递,以调整功能的大小,并在质量降低10%的情况下图像大小大于10KB,但我认为这不是必需的,在90%的质量下,所有JPEG图像都小于10KB。
还要注意,如果不进行压缩,则RGB图像的图像大小仅为30KB,如果将大小减小到60x60像素,则图像大小在没有任何压缩的情况下仅为10KB,即可以使用bmp图像;如果要减小大小,但可以进行无损压缩,则可以选择PNG。
因此,总而言之,您很容易实现10KB的目标。
您阅读了PIL文档吗?有一个image.thumbnail方法。