gpt4 book ai didi

Python:优化内存中的图像(使用 jpegoptim 的 StringIO 和 POpen)

转载 作者:行者123 更新时间:2023-11-30 23:14:31 25 4
gpt4 key购买 nike

我正在尝试使用各种库的 STDIN 版本(本例中为 jpegoptim)来压缩图像而不接触磁盘。

此代码不会返回优化的(jpegoptim 压缩的)图像。

有人可以帮忙或解释一下为什么 Popen() 与 StringIO.StringIO() 对象的使用不会返回图像的优化版本吗?如果我将文件保存到磁盘,它就可以正常工作。

import sys
import urllib2 as urllib
import StringIO

from subprocess import Popen, PIPE, STDOUT
fp = urllib.urlopen('http://www.path.to/unoptimized.jpg')
out_im2 = StringIO.StringIO(fp.read()) # StringIO Image
print "Image Size: %s" % format(sys.getsizeof(out_im2.getvalue()))
subp = Popen(["/usr/bin/jpegoptim", "-"], shell=True, stdout=PIPE, stdin=PIPE, stderr=STDOUT)
image_str = subp.communicate(input=out_im2.getvalue())[0]
out_im2.write(image_str)

##This should be a different size if it worked! It's not
print "Compressed JPG: %s" % format(sys.getsizeof(out_im2.getvalue()))

最佳答案

这是因为您正在写入相同的输入缓冲区。创建一个新的 StringIO()。

StringIO 缓冲区最初扩展到第一个未压缩 jpeg 的大小。然后,您使用新的较短字符串缓冲区从 0 位置开始写入该缓冲区,但它不会自动截断您的缓冲区或任何内容。 StringIO 缓冲区的大小仍然相同,实际上所有尾随数据都将是原始图像中的垃圾。

In [1]: import StringIO

In [2]: out = StringIO.StringIO("abcdefg")

In [3]: out.getvalue()
Out[3]: 'abcdefg'

In [4]: out.write("123")

In [5]: out.getvalue()
Out[5]: '123defg'

关于Python:优化内存中的图像(使用 jpegoptim 的 StringIO 和 POpen),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28710874/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com