我正在将一些代码从python2迁移到python3,后者从字节流加载图像。我需要生成的图像在所有像素中都具有完全相同的值。然而,在下面的实施方式中,两个图像在强度的一些值上的一些像素上不同。
以下是python 2.7的实现:
from PIL import Image
from cStringIO import StringIO
import requests
img_url = "https://images.unsplash.com/photo-1508921912186-1d1a45ebb3c1?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxzZWFyY2h8MXx8cGhvdG98ZW58MHx8MHx8&w=1000&q=80"
response = requests.get(img_url)
bytes_data = response.content
stream = StringIO(bytes_data)
img = Image.open(stream)
下面是python3.8的实现:
from PIL import Image
from io import BytesIO
import requests
img_url = "https://images.unsplash.com/photo-1508921912186-1d1a45ebb3c1?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxzZWFyY2h8MXx8cGhvdG98ZW58MHx8MHx8&w=1000&q=80"
response = requests.get(img_url)
bytes_data = response.content
stream = BytesIO(bytes_data)
img = Image.open(stream)
在这两个虚拟环境中,我使用相同版本的PIL(2.8.2(来确保差异不会来自于此(编辑1(- 请求-响应返回相同,
bytes_data
在两个实现中都是完全相同的字节字符串
我的猜测是像素差异来自流对象,但我对这个主题了解不多(编辑1(
编辑1:如果python2.7和python3.8中的PIL版本相同(2.8.2(,则结果相同。这将指出差异来自PIL版本,而不是python版本。
编辑2:加载的JPGS在PIL版本9.0.0 时开始不同
该流是JPEG数据。JPEG是有损的,并且允许JPEG编解码器的实现进行不同的近似和权衡,以便偏好性能、速度或压缩比。同样,同一个库的不同版本也可以这样做
我的猜测是,在这两种环境之间,您有一个不同的JPEG库版本。您应该能够使用进行检查
python3 -m PIL | grep -i JPEG
和
python2.7 -m PIL | grep -I JPEG
查看PIL版本的其他方式:
import PIL
print(PIL.__version__)
或者:
import PIL
print(dir(PIL))
或者从Python解释器之外的shell:
pip3 show Pillow
Name: Pillow
Version: 8.4.0
Summary: Python Imaging Library (Fork)
Home-page: https://python-pillow.org
Author: Alex Clark (PIL Fork Author)
Author-email: aclark@python-pillow.org
License: HPND
Location: /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages
Requires:
Required-by: CairoSVG, imageio, matplotlib