Как сохранить цвет RGB при сохранении png с помощью PIL? - PullRequest
0 голосов
/ 21 октября 2019

Я написал программу на python, которая объединяет три PNG-изображения в одно изображение. Я использую PIL, чтобы открыть, изменить размер, объединить и сохранить полученное изображение. Все функции есть, но полученное изображение имеет совершенно другой цветовой профиль по сравнению с оригиналом.

Я пробовал несколько вариантов:
1. Я попытался создать новое изображение как "RGBA"
Результат: Изображение больше не отображается в графическом интерфейсе TKinter
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

Результирующее изображение

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

profile = image.info.get("icc_profile", "") затем я использую результирующую переменную при сохранении файла с аргументом 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)

Результат:

enter image description here

0 голосов
/ 21 октября 2019

Я думаю, что есть проблема, когда вы открываете и читаете изображение. Попробуйте использовать графический интерфейс tkinkter, чтобы открывать и читать файлы, а затем использовать 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)

У вас есть изображение в режиме rgb в переменной image_data, сохраните его или используйте для дальнейшей обработки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...