Dlaczego kolory niektórych plików PNG ulegają zniekształceniu po otwarciu w programie Illustrator?

11

Próbowałem otworzyć zrzut ekranu iPhone'a w programie Illustrator, ale z jakiegoś powodu kolory są zniekształcone. Jeśli otworzę ten sam plik w dowolnej innej aplikacji (Photoshop, GIMP, Preview itp.), Kolory są renderowane dobrze. Ciekawe jest to, że dzieje się tak tylko w przypadku niektórych zrzutów ekranu, ponieważ testowałem również zrzut ekranu głównego, który otworzył Illustrator bez zniekształcania kolorów.

Chociaż w GIMP pojawia się okno dialogowe z informacją:

Obraz „IMG_1199.PNG” ma i osadzony profil kolorów:

Wyświetl P3

Konwertujesz obraz do przestrzeni roboczej RGB (wbudowany sRGB)?

Z opcją zachowania lub konwersji profilu kolorów; co sprawia, że ​​myślę, że Illustrator może nie rozpoznać wyżej wspomnianego profilu kolorów.

Oto oryginalny obraz bezpośrednio z telefonu [po lewej] i obraz został otwarty (następnie zapisany) w programie Illustrator [po prawej]:

Zrzut ekranu klawiatury iPhone'a Zrzut ekranu z klawiatury iPhone'a Zniekształcony


Aktualizacja

Konwersja profilu kolorów w GIMP, zapisanie, a następnie ponowne otwarcie pliku w programie Illustrator rozwiązuje problem. To wydaje się potwierdzać moje podejrzenie, że problemem jest profil kolorów Display P3, co nieco zmienia moje pytanie: jak mogę otworzyć obraz w programie Illustrator bez uprzedniej konwersji obrazu?

Wygląda na to, że może to być błąd w programie Illustrator, dlatego przesłałem raport o błędzie do Adobe. Dokonam aktualizacji, jeśli raport będzie rozstrzygający lub jeśli Adobe dostarczy rozwiązanie.

Bryan
źródło
1
Psychodeliczny! Znam ludzi, którzy jedzą pigułki, aby to zobaczyć. Hej Bryan, witaj w GDSE i dziękuję za pytanie. Jeśli masz jakieś pytania dotyczące tego SE, zajrzyj do centrum pomocy lub dołącz do nas na czacie graficznym ! Wnieś swój wkład i ciesz się czasem tutaj.
Vincent
Miałem mnóstwo problemów z zrzutami ekranu iPhone'a, ale nigdy czegoś takiego nie miałem. Imponujący.
Cai,
Czy profil kolorów P3 implikuje kolor 10bpp (czyli 30 bitów)? Czy to błąd, czy AI po prostu nie jest w stanie obsłużyć 10 pb (ARGB 02 10 10 10)? Zapytanie Umysły chcą wiedzieć. (edytuj: dla jasności, naprawdę chcę wiedzieć, ponieważ nie mam pojęcia)
Yorik
Dziwne: zarówno GraphicsMagick, jak identifyi Linux ' fileidentyfikują opublikowany zrzut ekranu po lewej stronie jako plik jpg pomimo przyrostka .png. Czy to jest oryginalny / niezmodyfikowany zrzut ekranu? Czy zmieniłeś nazwę sufiksu na .png? Może to jest problem. Spróbuj zmienić sufiks na jpg i otwórz go ponownie.
Socowi,
@Socowi Huh, to dziwne, sam to przetestowałem, używając filekomendy na macOS. Pojawia się JPEG image datarównież, mimo że okno informacyjne nadal wyświetla go jako plik PNG. To musi być coś, co robi Imgur, aby skalować zdjęcia. Jeśli pobrać obraz z pełnym rozmiarze linkufile polecenia powinien je rozpoznać prawidłowo jako plik PNG.
Bryan,

Odpowiedzi:

9

Co prawdopodobnie się wydarzy: zrzut ekranu jest 16-bitowym png, ale ilustrator odczytuje go jako 8-bitowy png, używając tylko 8 niższych (!) Bitów.

Wyjaśnienie

W poniższym objaśnieniu zakładamy, że zrzut ekranu jest 16-bitowym obrazem w skali szarości, co oznacza, że ​​każdy piksel jest liczbą pomiędzy

czarny = 0 = 0x0000 = 0b 0000 0000 0000 0000

i

(16-bit) biały = 2 ^ 16-1 = 65535 = 0xFFFF = 0b 1111 1111 1111 1111.

(0x oznacza liczby szesnastkowe, a 0b oznacza liczby binarne)

Program Illustrator wydaje się ładować tylko 8 z tych 16 bitów, niestety niewłaściwych, czyli najmniej znaczących. Wybór najmniej znaczących bitów jest jedynym problemem.

0b #### #### #### ####
   \_______/ \_______/
   discarded   loaded

Po zaimportowaniu program Illustrator skaluje interpretację (która jest biała, a czarna) zgodnie z nową maksymalną liczbą:

(8-bit) biały = 2 ^ 8-1 = 255 = 0xFF = 0xb 1111 1111.

Załóżmy, że jeden z naszych pikseli miał wartość 0b 1111 1111 0000 00001 = 0xFF01 = 65281, czyli prawie biały. Po imporcie wartość będzie wynosić 0b 0000 0001 = 0x01 = 1, czyli prawie czarna.

To jak „zaokrąglanie” 999,1 do 1 - zupełnie źle!

Symulacja

Jak możemy być pewni, że opisany problem jest naszym problemem? Symulujemy błąd!

Poniższy program python ładuje 16-bitowy zrzut ekranu, jak opisano powyżej.
(Proszę nie oceniaj mnie, to mój pierwszy program w języku Python).

#! /usr/bin/python
import numpy as np
import cv2

# load picture
img = cv2.imread('screen.png', 3)

# assert (by hand) that picture is loaded as 16 bit image
print img.dtype

# simulate the bug
img[:,:] &= 0x00FF # use only 8 least significant bits
img[:,:] <<= 8     # rescale

# save the picture
cv2.imwrite('bug.png',img)

Symulowany błąd
wynik bug.png
Kliknij tutaj, aby zobaczyć oryginalny rozmiar, a tutaj, aby porównać z wersją OP.

Jak widzimy, nasza symulacja daje dokładnie ten sam wynik.

Obejście

Mogę wymyślić tylko jedno obejście (ponieważ nie używam ilustratora):

Konwertuj zrzuty ekranu na 8-bitowe pliki PNG

GraphicsMagick i / lub ImageMagick to narzędzia konsolowe, które są odpowiednie do tego zadania. Następujące polecenie konwertuje na 8-bitowe pngs:

convert original.png -depth 8 converted.png
Socowi
źródło
Wow, dziękuję za szczegółowe wyjaśnienie. Adobe nie zareagował jeszcze na mój raport o błędzie, ale przy odrobinie szczęścia mam nadzieję, że dodadzą odpowiednią 16-bitową obsługę kolorów do programu Illustrator. Lub przynajmniej zaokrąglić je poprawnie do koloru 8-bitowego.
Bryan,
1

To jest trochę funky problem.

GIMP już daje nam pewną wskazówkę, potwierdzając podejrzenie, że jest to coś z profilem kolorów zrzutu ekranu. Przekształcenie go w codzienne sRGB i 8 bitów na kanał może pozwolić programowi Illustrator na zepsucie się podczas próby wyciągnięcia go jako CMYK.

Lucas Flicky
źródło
1

Jest OSTATNIE późno, ale prostym obejściem (dla użytkowników komputerów Mac) jest otwarcie PNG w podglądzie, a następnie wyeksportowanie go jako PNG, przełączając domyślną opcję 16-bitową na opcję 8-bitową. Nie wymaga żadnego dodatkowego oprogramowania i zajmuje tylko kilka sekund.

Glina
źródło