python修改图片大小为30kb_关于python:生成小于10KB且未丢失比例的图像缩略图

本文介绍了如何使用Python的PIL库创建保持比例的图像缩略图,同时确保缩略图文件大小小于10KB。通过逐步调整图像尺寸,找到最佳的缩放比例以满足大小限制。
摘要由CSDN通过智能技术生成

请注意,对于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方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值