Przejrzystość do niepodzielonego RGB + Alpha


16

Mam przezroczystą warstwę w Photoshop CS5 (więc wewnętrznie najprawdopodobniej jest przechowywana jako niepopowielony składnik RGB plus składnik alfa na piksel).

Teraz chcę przekształcić to w nieprzezroczystą warstwę (tylko niepopowielony RGB) + maskę alfa. wynik powinien wyglądać tak samo jak oryginał.

Nie mogę po prostu podkładać przezroczystej warstwy kolorem czarnym, wziąć z niej zaznaczenie jako maskę i scalić warstwy, ponieważ spowodowałoby to wstępne pomnożenie alfa w wartościach RGB.

Mam nadzieję, że rozumiesz problem i możesz mi go rozwiązać.

Jako alternatywne wyjaśnienie: chcę proces ODWRÓCENIA tego:

  1. utwórz nową warstwę i wklej na dowolnym obrazie
  2. utwórz maskę z gradientem bieli do czerni
  3. zastosuj maskę warstwy

Objaśnienia:

Stan A: wprowadź opis zdjęcia tutaj

Stan B: wprowadź opis zdjęcia tutaj


WAŻNE: warstwa jest tylko dla tego przykładu w pełni stała na czerwono - ale można pomyśleć o dowolnym dowolnym obrazie zamiast stałej czerwieni. więc - aby przejść ze stanu A do stanu B, wystarczy po prostu zastosować maskę warstwy.

Chcę wiedzieć, jak przejść ze stanu B do stanu A.


Zastanawiam się, czy może tu pomóc jakiś rodzaj wtyczki maskującej. Informacje o kryciu istnieją, to tylko kwestia tego, jak je zdobyć. Uzyskiwanie informacji o poziomie pikseli nie istnieje w interfejsach API skryptów (przynajmniej w Applescript, ale wydaje się, że wszystkie obsługiwane języki są zgodne z tym, co widziałem).
Philip Regan,

Odpowiedzi:



5

Źle! Wszystko źle!

Oszukałem siebie, a także ciebie w tym procesie: to, co stworzyłem, jest rzeczywiście pomnożonym obrazem - nie pomnożonym wcześniej z czarnym, ale z białym. Pozostawiam tę odpowiedź innym, aby mogli z niej skorzystać.


Udało mi się to zrobić w następujący sposób:

  1. Wyodrębnij prawdziwe kanały RGBA z obrazu
  2. Użyj ich do zbudowania nowego obrazu

A oto jak to zrobiłem:

obraz testowy

To jest obraz testowy, którego użyłem. Widok kanału w PS wygląda następująco:

kanały

Wybierając poszczególne kanały, skopiowałem je na poszczególne warstwy, a następnie spłaszczyłem je białym tłem, aby uzyskać czarno-białą mapę, jak pokazano tutaj:

bw-map

Wyodrębniłem także przezroczystość oryginalnego obrazu do warstwy, klikając miniaturę warstwy i wypełniając nową warstwę zaznaczeniem.

Następnie stworzyłem nowy obraz o tych samych wymiarach i bez przezroczystości. Następnie wkleiłem utworzone warstwy RGB do odpowiednich kanałów na nowym obrazie:

kanały nowego obrazu

W ostatnim kroku „spłaszczyłem” warstwę, klikając dwukrotnie, i utworzyłem maskę warstwy przy użyciu warstwy alfa z oryginalnego obrazu, w wyniku czego:

maska ​​warstwy


Jak wspomniano powyżej, nie tworzy to niepoprawionego obrazu, ponieważ mój przykład musiałby wyglądać tak, aby nie został pomnożony:

poprawna wersja

Czy ktoś jest mądrzejszy ode mnie i może to stworzyć? Uważam, że bez zaawansowanego skryptowania opartego na pikselach nie jest to możliwe w Photoshopie.



2

Na podstawie udzielonych odpowiedzi i komentarzy krótka odpowiedź brzmi: nie możesz robić tego, co chcesz. Po zastosowaniu maski warstwa jest renderowana, a niewidoczne dane obrazu są wyrzucane.

EDYTOWAĆ:

Zrobiłem kilka przykładowych plików png, a następnie użyłem php do manipulacji nimi (kod źródłowy poniżej).

Jeśli utworzę plik png z losową przezroczystością i zapiszę, gdy warstwa ma maskę, wówczas 100% jasne obszary (na przykład z narzędzia do tworzenia ramek) pokażą się jako białe, niezależnie od tego, czy obsługa alfa jest włączona. Gradienty, które zawierają pewną ilość 100% przezroczystości, nie pojawiają się przy wyłączonym alfa.

Jeśli zastosuję maskę warstwy (na stałe), a następnie utworzę png, to php wyświetli oryginalny obraz, jeśli alfa jest wyłączone.

Tak więc potencjalnym rozwiązaniem tego problemu jest znalezienie pakietu oprogramowania, który nie obsługuje wersji alfa PNG i stamtąd go ponownie zapisać. Jeśli chodzi o odzyskiwanie oryginalnej maski, jeszcze na nią nie patrzyłem.

Oba przykłady kodu są proof-of concept i SLOW.

<?php

$im = imagecreatefrompng('./images/alphatest_nolayer.png');
$enable_alpha = 0;  //set to 0 to disable aplha

if ($enable_alpha) {
    imagealphablending($im, false);
    imagesavealpha($im, true);
}

header('Content-Type: image/png');
imagepng($im);

imagedestroy($im);

?>

Aby wyodrębnić alfa (uwaga: php ma ograniczenie GD do 128 poziomu alfa, zamiast 256), więc traci się pewną precyzję. Alfa może być rozciągnięta do 256 za pomocą narzędzia poziomów)

<?php

$im = imagecreatefrompng('./images/alphatest_nolayer.png');
$w = imagesx($im);
$h = imagesy($im);

$om = imagecreatetruecolor($w,$h);

for ($x = 0; $x < $w; $x++) {
    for ($y = 0; $y < $h; $y++) {
        $rgb = imagecolorat($im, $x, $y);
        $colors = imagecolorsforindex($im,  $rgb);

        $orgb = imagecolorallocate($om,$colors['alpha'],$colors['alpha'],$colors['alpha']);
        imagesetpixel($om,$x,$y,$orgb);
    }
}

header('Content-Type: image/png');
imagepng($om);

imagedestroy($om);
imagedestroy($im);

?>

ale dane wciąż tam są. to część RGB danych pikseli RGBA. musi istnieć sposób na jego wyodrębnienie
Mat

1
dlaczego nie podasz przykładowego pliku w świecie rzeczywistym? W swoim pytaniu wyraźnie pokazujesz pojedynczą warstwę z przezroczystym obszarem i bez maski, ani ze wskazaniem kanału alfa.
horatio

.png ma predefiniowany kolor palety dla 100% przezroczystej czerni, który prawdopodobnie zostanie użyty (przez Photoshopa), gdy będzie 100% przezroczystości tylko w celu zaoszczędzenia miejsca na dysku.
Ars Magika

Nie jestem pewien, czy to faktycznie odpowiada na pytanie - wydaje się być specyficzne dla obsługi PNG.
e100

2

Dowiedziałem się, jak to zrobić w GIMP , może to nie być PhotoShop, ale przynajmniej zrobi to, o co poprosisz. (I tak to interpretuję;))

  • Otwórz obraz w GIMP.
  • Kliknij prawym przyciskiem myszy na warstwie w polu warstw
  • Wybierz „ dodaj maskę warstwy ” z menu kontekstowego
  • W poniższym menu wybierz „ przenieś kanał alfa warstw ” i kliknij przycisk „ dodaj

W tym momencie masz obraz z maską kanału alfa.

Możesz pójść o krok dalej:

  • Kliknij maskę warstwy prawym przyciskiem myszy i wybierz „ usuń maskę warstwy
  • Teraz masz obraz bez maski alfa.

Jest też klip na youtube, jak to zrobić.


Roberto: Tak, znalazłeś odpowiedź. Właśnie tego chcemy i to nic nie kosztuje !!

1

To wydaje się zadziwiająco złożone. Jeśli dobrze rozumiem oryginalne pytanie i jego różne wyjaśnienia, problem polega na tym, aby wziąć dowolny obraz zawierający przezroczystość i uczynić go całkowicie nieprzezroczystym, a następnie zastosować oryginalne wartości alfa jako maskę, aby odtworzyć oryginalny wygląd.

Jeśli to jest pytanie, jest to bardzo prosta, choć trochę nudna odpowiedź.

  1. Skopiuj warstwę 10 razy. Przezroczystość „wypełni” obraz kompozytowy.

  2. Scal wszystkie kopie (ale NIE oryginalną warstwę , której będziesz potrzebować w ostatnich krokach).

  3. Powtórz kroki 1 i 2 ze scaloną warstwą, a następnie zrób to ponownie. W tym momencie wszystkie piksele, które były mniej niż w 100% przezroczyste, są teraz w 100% nieprzezroczyste (jeśli są jakieś tasiemki, po prostu powtarzaj proces, aż ich nie będzie). To tyle informacji o obrazie, ile można odzyskać.

  4. Ctl / Cmd-Kliknij oryginalną miniaturę warstwy, aby załadować jej przezroczystość.

  5. Po wybraniu nowej, nieprzezroczystej warstwy kliknij ikonę maski warstwy w panelu Warstwy.


0

Ok, to jest całkiem proste (musisz zignorować maszerujące mrówki)

Utwórz nową warstwę i wypełnij ją dowolnym kolorem, którego używasz (jeśli próbkowanie zabierze ją z martwego środka pierwszego obrazu)

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Następnie zrób pierwsze zdjęcie i CTRL + kliknij miniaturę warstwy, powinieneś zobaczyć jej wersję: wprowadź opis zdjęcia tutaj

Jak powiedziałem wcześniej: zignoruj ​​maszerujące mrówki, wtapianie włącza się automatycznie w CS5.

Następnie upewnij się, że wybrano wypełnioną warstwę i kliknij przycisk maski:

wprowadź opis zdjęcia tutaj

Następnie po prostu ukryj dolną warstwę i powinieneś to zrobić, z dokładnie takim efektem, jakiego szukasz :)

wprowadź opis zdjęcia tutaj

I w ten sposób można odtworzyć zastosowaną maskę w CS5. Funkcja zaznaczania warstw CS5 jest dość zaawansowana, więc przez większość czasu po prostu ignoruj ​​maszerujące mrówki, ponieważ nie pokazują one prawidłowo wtapiania się z zaznaczeniem :)

Mam nadzieję, że ci się uda.


dziękuję za odpowiedź, ale nie tego szukam - jak wyjaśniono, stała czerwień jest właśnie dla tego przykładu! może to być KAŻDY obraz (nie tylko stały kolor wypełnienia) - i oczywiście nie mam dostępnego oryginalnego nieprzezroczystego obrazu
Mat

Powinieneś opublikować swój obraz w swoim pytaniu. Jeśli opublikujesz stałe wypełnienie, odpowiemy na podstawie stałego wypełnienia. Spróbuj jednak użyć tutaj technik, wybór CS5 jest bardzo zaawansowany, może cię zaskoczyć. To mi zrobiło.
Kyle

oczywiście wiem o tych technikach selekcji! problemem jest to, jak uzyskać dostęp do RGB tylko części przezroczystej warstwy
Mat

Nad warstwami znajdują się trzy zakładki, kanały klikania. Tam masz czerwoną, zieloną, niebieską i maskę warstw. Może właśnie o to ci chodzi?
Kyle

ale warstwa jak w neo.cycovery.com/alpha_prob2.jpg nie pokazuje kanału alfa - zamiast tego wyświetla tylko kanały RG i B z już zastosowaną przezroczystością
Mat

0

To, co chcesz zrobić, można łatwo zrobić za pomocą wtyczki, takiej jak wtyczka Photofreebies „Usuń przezroczystość”. Najpierw kliknij warstwę, aby wybrać przezroczyste piksele, a następnie zapisz informacje o przezroczystości w nowym kanale, aby je zachować. Następnie zastosujesz filtr „Usuń przezroczystość” i zobaczysz, że „ukryte” piksele w warstwie stają się nieprzezroczyste (całkiem interesujące, jak układ Photoshopa układa twoje 100% przezroczyste piksele BTW). Naprawdę żałuję, że przez lata nie był on wbudowany w Photoshopa, ale niestety zbyt zaawansowany.

Niestety nie mogę znaleźć wersji takiej wtyczki zgodnej z programem Photoshop CS6 dla komputerów Mac, więc utknąłem w tej chwili. GraphicConverter też może to zrobić (Usuń kanał alfa).


0

Oto odpowiedź:

  1. Utwórz warstwę z materiałami, które chcesz na obrazie.

  2. Wybierz żądany kanał alfa.

  3. Ustaw zaznaczenie jako „maskę warstwy” dla warstwy obrazu.

  4. Kliknij maskę warstwy prawym przyciskiem myszy i wybierz „Zastosuj maskę warstwy”.

Teraz zaczyna się magia:

  1. Przejdź do „Layer”, a na dole: „Matting”, a następnie wybierz „Remove black matte”.

Zapraszamy!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.