我撰寫了一個 Python 腳本,將一對立體影像融合到一個立體影像中。當我在 tkinter 應用程式中查看影像時,我寫的影像看起來不錯,但是當我將 JPG 和 PNG 保存到 Photoshop 時,它看起來“混亂”。有一段時間我想知道我是不是瘋了,但我讓我的家人看了這些照片,他們同意了。
我認為問題與被搞砸的顏色有關,我想我可以通過制作更簡單的影像來證明這一點,所以我制作了一些看起來像電視測驗圖案的東西。這是吸煙槍:
顯示問題的螢屏截圖
左側是顯示彩條的 tkinter 應用程式,右側是我在 Windows 照片查看器中查看應用程式匯出的影像,我將其稱為 A.PNG。
綠色顯然不同,如果我將螢屏截圖 (B.PNG) 加載到 Photoshop 中,我會看到左側影像上的黃色條是 (180, 180, 16),這是它應該的樣子,但照片查看器顯示 ( 176,178,41) 為黃色。如果我在 A.PNG 上使用吸管,黃色是 (180, 180, 16) 所以問題是當影像被其他應用程式加載時,顯示的顏色會更改為其他顏色。
我很確定這與色彩管理或伽馬校正有關,但我不知道該怎么處理我的影像,所以我可以用其他程式查看它或列印出來,讓顏色看起來像在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]
uj5u.com熱心網友回復:
這是我想出來的。
我用 Pillow 制作的 JPG 和 PNG 檔案與我用來制作螢屏截圖的 Photoshop 和 Snagit 保存的檔案沒有什么顯著不同。(我撰寫了一些 Python 腳本,從影像中洗掉了元資料,例如 ICC 組態檔)
然而,我的顯示幕是戴爾 U2711,它是一款廣色域顯示幕。Photoshop、Windows Photo Viewer 和 Firefox Web 瀏覽器等應用程式為顯示幕應用顏色組態檔,因此您在螢屏截圖中捕獲的任何內容都已轉換為顯示幕的顏色空間。(180, 180, 16) 在螢屏截圖中轉換為 (176,178,41)。Tkinter 是一個古老的應用程式,它沒有顏色管理,所以你要求 (180, 180, 180) 并且你真的在螢屏截圖中得到了它。當我在筆記本電腦的內置顯示幕上截屏時,我發現截屏中的顏色與 Photoshop 中的吸管工具一致,并且在 tkinter 和 Photoshop 中是相同的。
uj5u.com熱心網友回復:
您可以嘗試復制基本圖案的顏色組態檔嗎?像這樣:
profile = pattern.info.get("icc_profile", "")
pattern.save(r"D:\test-pattern.png", icc_profile = profile)
我基本上看到了這篇文章,我相信解決方案可能是相關的。
如何在使用 PIL 保存 png 時保留 RGB 顏色?
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/505843.html
標籤:Python 图片 tkinter python成像库
上一篇:無法將PNG轉換為縮放位圖
