Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 生成的图像缩略图为<;10KB,并且没有失去比例_Python_Image Processing_Python Imaging Library - Fatal编程技术网

Python 生成的图像缩略图为<;10KB,并且没有失去比例

Python 生成的图像缩略图为<;10KB,并且没有失去比例,python,image-processing,python-imaging-library,Python,Image Processing,Python Imaging Library,请注意,谷歌索引的每一幅图像都有一个小图标。 这些缩略图是: 小于10KB的大小 宽度/高度的比例与原始图像中的比例相同 我想用python编写一个函数,它将获取一个图像并使用这些属性创建一个缩略图 编辑: 现在有三个答案,所有答案都是对的一半 我需要一个函数,不仅按比例调整图像大小,而且还确保文件大小小于10KB。我该怎么做呢?你读了那本书了吗?有一个image.thumbnail方法。您阅读了吗?有一种image.缩略图方法。在中,Mike Fletcher和effbot为您想要完成的任务展

请注意,谷歌索引的每一幅图像都有一个小图标。 这些缩略图是:

  • 小于10KB的大小
  • 宽度/高度的比例与原始图像中的比例相同
  • 我想用python编写一个函数,它将获取一个图像并使用这些属性创建一个缩略图

    编辑: 现在有三个答案,所有答案都是对的一半

    我需要一个函数,不仅按比例调整图像大小,而且还确保文件大小小于10KB。我该怎么做呢?

    你读了那本书了吗?有一个image.thumbnail方法。

    您阅读了吗?有一种image.缩略图方法。

    在中,Mike Fletcher和effbot为您想要完成的任务展示(并讨论详细的变化)了一种极好的方法

    编辑:对于10K的要求,很难(至少可以说;-)预测图像的压缩效果,这取决于图像的格式,因为今天的压缩算法非常微妙。如果您希望缩略图尽可能大(以像素为单位),同时考虑in,Mike Fletcher和effbot将为您想要执行的任务展示(并讨论详细的变化)一种极好的方法


    编辑:对于10K的要求,很难(至少可以说;-)预测图像的压缩效果,这取决于图像的格式,因为今天的压缩算法非常微妙。如果您希望缩略图尽可能大(以像素为单位),同时考虑使用PIL,请参阅此处的示例代码以调整纵横比

    了解如何在目录上执行类似的操作

    所以上面的链接描述了如何使用PIL调整图像大小,现在是关于10KB的最大大小的问题,这很容易实现,例如

    假设所需大小为100x100,我们使用JPEG压缩,100%JPEG质量每像素需要9位(请参阅),这意味着100x100图像的大小将为100x100x9/(1024x8)=11KB,因此在质量=100时,您几乎达到了您的目标,但如果您仍然需要10KB,则只能将质量设置为90,一般来说,如果图像大小大于10KB,您可以将质量作为参数传递给resize函数,并将质量降低10%,但我认为这是不必要的,在90%的质量下,所有JPEG图像都将小于10KB

    另外请注意,如果不进行压缩,RGB图像的图像大小仅为30KB,如果将图像大小减小到60x60像素,则不进行任何压缩,图像大小仅为10KB,即,您可以使用bmp图像,如果您希望使用较小的尺寸,但进行无损压缩,则可以选择PNG


    总之,10KB的目标很容易实现。

    使用PIL,请参阅此处的示例代码以调整大小以保持纵横比

    了解如何在目录上执行类似的操作

    所以上面的链接描述了如何使用PIL调整图像大小,现在是关于10KB的最大大小的问题,这很容易实现,例如

    假设所需大小为100x100,我们使用JPEG压缩,100%JPEG质量每像素需要9位(请参阅),这意味着100x100图像的大小将为100x100x9/(1024x8)=11KB,因此在质量=100时,您几乎达到了您的目标,但如果您仍然需要10KB,则只能将质量设置为90,一般来说,如果图像大小大于10KB,您可以将质量作为参数传递给resize函数,并将质量降低10%,但我认为这是不必要的,在90%的质量下,所有JPEG图像都将小于10KB

    另外请注意,如果不进行压缩,RGB图像的图像大小仅为30KB,如果将图像大小减小到60x60像素,则不进行任何压缩,图像大小仅为10KB,即,您可以使用bmp图像,如果您希望使用较小的尺寸,但进行无损压缩,则可以选择PNG


    总之,10KB的目标很容易实现。

    重复:这不是重复!正如我在“编辑”中所说,我需要一个功能,它不仅可以按比例调整图像大小,还需要确保大小小于10KB。复制:这不是重复!正如我在“编辑”中所说,我需要一个函数,它不仅可以按比例调整图像大小,还需要确保图像大小小于10KB。
    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()