注意谷歌索引的每张图片都有一个小的 thumbnail . 这些缩略图是:
- 小于 10KB。
- 宽/高的比例与原图相同。
我想编写一个函数(在 python 中)来获取图像并使用这些属性创建缩略图。
编辑: 所以现在有 3 个答案,所有答案都对了一半。
我需要一个功能,不仅可以按比例调整图像大小,而且可以确保文件大小小于 10KB。我该怎么做?
最佳答案
在this short post 、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, <max_bytes'''
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 (<%d), reducing less" % min_bytes
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()
关于python - 生成小于 10KB 且不丢失比例的图像缩略图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1075037/