python - 在 tkinter 中查看的枕头生成图像中的颜色与保存文件中的颜色不匹配

标签 python image tkinter python-imaging-library

我写了一个 Python 脚本,将一对立体图像融合成立体图像。当我在 tkinter 应用程序中查看图像时,我写的图像看起来不错,但是当我将图像另存为 JPG 和 PNG 到 Photoshop 时,它看起来“很困惑”。有一段时间我在想我是不是疯了,但我让我的家人看了这些照片,他们同意了。

我认为问题与颜色被搞砸有关,我认为我可以通过制作更简单的图像来证明这一点,所以我制作了一些看起来像电视测试图案的东西。这是确凿的证据:

screenshot that shows the problem

左边是显示颜色条的 tkinter 应用程序,右边是我在 Windows 照片查看器中查看应用程序导出的图像,我将其称为 A.PNG。

绿色明显不同,如果我将屏幕截图 (B.PNG) 加载到 Photoshop 中,我会看到左侧图像上的黄色条是 (180, 180, 16) 这应该是什么,但是照片查看器显示 (176,178,41) 为黄色。如果我在 A.PNG 上使用吸管,黄色为 (180, 180, 16),所以问题是当其他应用程序加载图像时,显示的颜色会更改为其他颜色。

我很确定这与色彩管理或 Gamma 校正有关,但我不知道如何处理我的图像,以便我可以使用其他程序查看它或打印出来并让颜色看起来像他们在 tkinter 中这样做。

这是生成颜色条的脚本,将它们写入文件并写入 PNG

from math import floor
from tkinter import Tk, Label

from PIL.Image import new
from PIL import ImageDraw, ImageTk

_480p=(640,480)
WHITE75 = (180,180,180)
YELLOW75 = (180,180,16)
CYAN75= (16,180,180)
GREEN75= (16,180,16)
MAGENTA75 = (180,16,180)
RED75 = (180,16,16)
BLUE75 = (16,16,180)
BLACK75 = (16,16,16)
RAINBOW75 = [WHITE75, YELLOW75, CYAN75, GREEN75, MAGENTA75, RED75, BLUE75]
LOWER75 = [BLUE75, BLACK75, MAGENTA75, BLACK75, CYAN75, BLACK75, WHITE75]
GRAYS = [(16*i,16*i,16*i) for i in range(1,15)]
REDS = [(16*i,0,0) for i in reversed(range(1,15))]
GREENS = [(0,16*i,0) for i in range(1,15)]
BLUES = [(0,0,16*i) for i in reversed(range(1,15))]

class TestPattern():
    def draw(self):
        self.x = new("RGB",_480p,"black")
        self.bars(RAINBOW75,0,320)
        self.bars(LOWER75,320,360)
        self.bars(GRAYS,360,420)
        self.bars(REDS,420,440)
        self.bars(GREENS,440,460)
        self.bars(BLUES,460,480)
        return self.x

    def bars(self,colors,top,bottom):
        draw = ImageDraw.Draw(self.x)
        barwidth = 640 / len(colors)
        for i in range(len(colors)):
            draw.rectangle([floor(i*barwidth),top,floor((i+1)*barwidth),bottom], fill=colors[i])

root = Tk()
root.title("Image Loader")
root.geometry(f"640x480+300+150")
root.resizable(width=True, height=True)

pattern = TestPattern().draw()
pattern.save(r"D:\test-pattern.png")
tkimg = ImageTk.PhotoImage(pattern)
panel = Label(root, image=tkimg)
panel.image = tkimg
panel.grid(row=1, column=1)
root.mainloop()

curve=[23,37,51,66,80,96,111,126,142,158,174,190,206,222]

最佳答案

这是我想出来的。

我用 Pillow 制作的 JPG 和 PNG 文件与我用来制作屏幕截图的 Photoshop 和 Snagit 保存的文件没有明显不同。 (我写了一些 Python 脚本,从图像中删除了元数据,例如 ICC 配置文件)

不过,我的显示器是戴尔 U2711,它是一款宽色域显示器。 Photoshop、Windows 照片查看器和 Firefox 网络浏览器等应用程序为显示器应用颜色配置文件,因此您在屏幕截图中捕获的任何内容都已转换为显示器的颜色空间。 (180, 180, 16) 在屏幕截图中转换为 (176,178,41)。 Tkinter 是一个没有颜色管理的古老应用程序,所以你要求 (180, 180, 180) 并且你真的在屏幕截图中得到了它。当我在笔记本电脑的内置显示器上截取屏幕截图时,我发现屏幕截图中的颜色与 Photoshop 中的吸管工具一致,并且在 tkinter 和 Photoshop 中也相同。

关于python - 在 tkinter 中查看的枕头生成图像中的颜色与保存文件中的颜色不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73564183/

相关文章:

javascript - 在 Wenhixin bootstrap-table 中包含图像

Python tkinter slider 控件

python - 将简单的 Web 服务器集成到 Python 中的自定义主循环中?

python - 测试时为真的 Django 变量

python - 如何在 wxPython ComboBox 中存储字符串以外的对象?

python - PyInstaller exe 在 Tkinter 脚本上返回错误

python - 在拖动事件中,所有选定的按钮都应在 Tkinter Python 中着色

python - C++在python中内存不足,剩余空间充足

image - Grails渲染插件不会渲染图像

java - 使用 JCROP 和 JQUERY 从基于 jsp..url 的图像源/动态图像不工作来裁剪图像