老哥们有没有用过 PIL 处理图像的,遇到一个奇异的问题

2020-01-20 10:09:22 +08:00
 ppzbreeze
在用 PIL 处理 jpg 图像的时候,我把图像的 RGB 分别设置成 255,255,254,保存成文件,但是再打开之后就变成 255,255,253 了,这是什么奇怪的现象?

def test():
width_qr = img_test.size[0]
height_qr = img_test.size[1]
for i in range(0,width_qr):
for j in range(0,height_qr):
img_test.putpixel((i, j), (255, 255, 254, 1))
img = img_test.convert("RGB")
img.save("F:/p/test2.jpg")
img_test1 = Image.open("F:/p/test2.jpg")
width_test = img_test1.size[0]
heigth_test = img_test1.size[1]
for i in range(0,width_test):
for j in range(0,heigth_test):
data = (img_test1.getpixel((i, j)))
print(data)
1912 次点击
所在节点    程序员
10 条回复
MinQ
2020-01-20 10:29:09 +08:00
jpg 的锅,作为压缩图片,jpg 不保证存储的时候值的一致性。想要保证图片在保存后的一致性,请用 png 格式
JConlee
2020-01-20 10:29:41 +08:00
试了一下,jpg 改成 png 就正常了
jdhao
2020-01-20 10:32:26 +08:00
应该是 JPG 图片在保存的时候一些压缩算法,更改了像素值。
ppzbreeze
2020-01-20 11:19:47 +08:00
@MinQ 有时候波动不止 1,可能达到 2-3 甚至 4,看来还是要 png 靠谱些

@jdhao 老哥有深入研究过这个吗
qieqie
2020-01-20 11:29:16 +08:00
jpeg save 的时候可以设置 quality
nightwitch
2020-01-20 11:34:16 +08:00
jpg 是压缩格式,涉及到浮点运算和采样,尤其是采样,难免会有波动
jdhao
2020-01-20 12:02:53 +08:00
@ppzbreeze 没有深入研究,记得在 stack overflow 看到过,你的需求没说清楚,具体要做什么用呢
Death
2020-01-20 12:06:23 +08:00
普通的 jpeg 是有损压缩
no1xsyzy
2020-01-20 12:58:21 +08:00
“有损”
看下 JPEG 的原理就行了
简单地说,通过了一个低通滤波器
GrayXu
2020-01-20 13:17:51 +08:00
因为 PIL save to jpg 有压缩,你搞个正常图进去出来一次就发现细节损失了。指定下 quality 参数就好了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/639364

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX