Я пытаюсь сжать изображения, не касаясь диска, используя версию STDIN различных библиотек (jpegoptim в этом примере).Python: оптимизация изображений в памяти (StringIO & POpen с 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()))
FYI, jpegoptim 1.4+ требуется для функциональности stdin. – ryan83