如何在使用 PIL 保存 png 的同时保留 RGB 颜色?

How to preserve RGB color while saving png using PIL?

我编写了一个 python 程序,可以将三个 png 图像组合成一个图像。我正在使用 PIL 打开、调整大小、合并和保存生成的图像。所有功能都在那里,但生成的图像与原始图像具有完全不同的颜色配置文件。

我尝试了几种选择:
1. 我尝试将新图像创建为 "RGBA"
结果: TKinter GUI 不再显示图像
2. 尝试从原始图像复制颜色配置文件,然后在保存最终图像时使用该配置文件:
代码: profile = image.info.get("icc_profile", "") 然后我在使用参数 icc_profile = profile 保存文件时使用结果变量 结果:无变化

最小可重现代码

from PIL import Image as pImage
from tkinter.filedialog import asksaveasfilename

newImage = pImage.new('RGB', (976, 976))
background = pImage.open("Gameboy_Background.png")
screen_shot = pImage.open("screenshot.png")
cover_art = pImage.open("[coverart.png][1]")
newImage.paste(background)

w, h = screen_shot.size
newW = 875
newH = int(newW * h / w)
screen_shot = screen_shot.resize((newW, newH), pImage.ANTIALIAS)
newImage.paste(screen_shot, (50, 155))

w, h = cover_art.size
newW = 175
newH = int(newW * h / w)
cover_art = cover_art.resize((newW, newH), pImage.ANTIALIAS)
newImage.paste(cover_art, (100, 205))

file2Save = asksaveasfilename(initialdir="/", title="Select file", filetypes={("PNG files", "*.png")})
newImage.save(file2Save + ".png", "PNG")

使用的 PNG 图片
1: https://i.stack.imgur.com/Lj1wo.png [2]: https://i.stack.imgur.com/4iauQ.png [3]: https://i.stack.imgur.com/2voFC.png

Resulting Image

我认为当你打开和读取时有问题 image.Try 这个使用 tkinkter gui 打开和读取文件然后使用 numpy 转换成数组。像这样的代码:

import tkinter as tk
from tkinter import filedialog
import numpy as np
//get ur extension as png file
root = tk.Tk()
root.withdraw()
file_path = filedialog.askopenfilename(filetypes = (("jpeg files","*.jpg"),("all files","*.*")))
images = Image.open(file_path)
image_data=np.asarray(image)
image_data = cv2.cvtColor(image_data, cv2.COLOR_BGR2RGB)

你在 image_data 变量中有你的 rgb 模式图像保存它或将它用于进一步处理

profile = image.info.get("icc_profile", "") then I use the resulting variable when saving the file using the argument icc_profile = profile

实际上,这听起来对我来说是正确的方法。 image是截图图片吧?这就是您要复制其个人资料的人。

from PIL import Image as pImage
from tkinter.filedialog import asksaveasfilename

newImage = pImage.new('RGB', (976, 976))
background = pImage.open("Gameboy_Background.png")
screen_shot = pImage.open("screenshot.png")
cover_art = pImage.open("coverart.png")
newImage.paste(background)

profile = screen_shot.info.get("icc_profile", "")

w, h = screen_shot.size
newW = 875
newH = int(newW * h / w)
screen_shot = screen_shot.resize((newW, newH), pImage.ANTIALIAS)
newImage.paste(screen_shot, (50, 155))

w, h = cover_art.size
newW = 175
newH = int(newW * h / w)
cover_art = cover_art.resize((newW, newH), pImage.ANTIALIAS)
newImage.paste(cover_art, (100, 205))

file2Save = "output"
newImage.save(file2Save + ".png", "PNG", icc_profile=profile)

结果: