Прозрачность для неумноженного RGB + Alpha

16

У меня есть прозрачный слой в Photoshop CS5 (так что внутри, он, скорее всего, хранится как неотмноженный компонент RGB плюс альфа-компонент на пиксель).

Теперь я хочу преобразовать это в непрозрачный слой (просто без умножения RGB) + альфа-маску. результат должен выглядеть так же, как оригинал.

Я не могу просто заложить прозрачный слой черным, взять выделение из него как маску и объединить слои, потому что это приведет к предварительному умножению альфа в значениях RGB.

Я надеюсь, что вы понимаете проблему и можете дать мне решение.

Как альтернативное объяснение: я хочу ОБРАТНЫЙ процесс этого:

  1. создайте новый слой и вставьте любое изображение
  2. создайте маску с градиентом от белого к черному
  3. применить маску слоя

Объяснение изображения:

Состояние А: введите описание изображения здесь

Состояние Б: введите описание изображения здесь


ВАЖНО: слой только для этого примера полностью постоянный красный - но вы можете думать о любом произвольном изображении вместо постоянного красного. Итак, чтобы перейти из состояния A в состояние B, нужно просто применить маску слоя.

Я хочу знать, как перейти из государства B в государство A.

Мат
источник
Интересно, может ли здесь помочь какой-нибудь плагин для маскировки? Информация о непрозрачности существует, вопрос только в том, как ее получить. Получение информации на уровне пикселей отсутствует в API сценариев (по крайней мере, в Applescript, но все поддерживаемые языки, похоже, совпадают с тем, что я видел).
Филипп Риган

Ответы:

6

Я полностью понимаю вашу боль. Вот мое решение :)
Извлеките Alpha as Mask Action
Вот что он делает:

введите описание изображения здесь Изменить:
введите описание изображения здесь
я надеюсь, что это помогает :)

Miro
источник
Оу, круто .. Конечно, требуется использование действий, чтобы сделать его сносным процессом.
Арс Магика
5

Неправильно! Все не так!

Я дурачил себя и вас в процессе: то, что я создал, действительно является предварительно умноженным изображением - не умноженным предварительно на черный, а на белый. Я оставляю этот ответ на усмотрение других.


Мне удалось сделать это так:

  1. Извлечение истинных каналов RGBA из изображения
  2. Используйте их для создания нового изображения

И вот как я это сделал:

тестовое изображение

Это тестовое изображение, которое я использовал. Вид канала в PS выглядит так:

каналы

Выбрав отдельные каналы, я скопировал их в отдельные слои, а затем сплющил их на белом фоне, чтобы получить черно-белую карту, как показано здесь:

мт-карта

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

Затем я создал новое изображение с такими же размерами и без прозрачности. Затем я вставил созданные мной слои RGB в соответствующие каналы в новом изображении:

каналы нового изображения

На последнем шаге я «расстегнул» слой, дважды щелкнув по нему, и создал маску слоя, используя альфа-слой из исходного изображения, в результате чего:

слой маски


Как указано выше, это не создает необумноженное изображение, так как мой пример должен выглядеть следующим образом:

правильная версия

Кто-нибудь умнее меня и может это создать? Я считаю, что без продвинутых пиксельных сценариев это невозможно в Photoshop.

Флориан Доблер
источник
5

Хорошо - я создал простой фильтр pixelBender, который можно использовать с плагином Photoshop PixelBender (http://labs.adobe.com/downloads/pixelbenderplugin.html), чтобы удалить прозрачность для слоя. вот оно: http://neo.cycovery.com/removeTransparency.pbk

Мат
источник
2

Краткий ответ, основанный на данных ответах и ​​ваших комментариях: вы не можете делать то, что хотите. После того, как вы примените маску, слой визуализируется, а данные невидимого изображения выбрасываются.

РЕДАКТИРОВАТЬ:

Я сделал несколько примеров png-файлов, а затем использовал php для управления ими (исходный код ниже).

Если я создаю png со случайной прозрачностью и сохраняю, когда слой имеет маску, то 100% чистые области (например, из инструмента «Ящик») отображаются белым, независимо от того, включена ли поддержка альфа или нет. Градиенты, которые содержат некоторое количество прозрачности 100%, не отображаются с отключенной альфа.

Если я применяю маску слоя (навсегда), а затем создаю png, то php подает исходное изображение, если альфа отключена.

Таким образом, потенциальный обходной путь для этого - найти программный пакет, который не поддерживает альфа-PNG, и сохранить его оттуда. Что касается восстановления оригинальной маски, я еще не смотрел на это.

Оба примера кода являются проверкой концепции и МЕДЛЕННЫМ.

<?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);

?>

Чтобы извлечь альфа (примечание: php имеет ограничение GD альфа 128 уровня, а не 256), поэтому некоторая точность теряется. Альфа может быть растянута до 256 с помощью инструмента уровней)

<?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);

?>
Горацио
источник
но данные все еще там. это часть RGB данных пикселей RGBA. там должен быть способ извлечь его
Мат
1
почему вы не предоставите файл примера из реальной жизни? В вашем вопросе вы четко показываете один слой с прозрачной областью и без маски, ни с указанием альфа-канала.
Горацио
.png имеет предопределенный цвет палитры для 100% прозрачного черного, который, вероятно, будет использоваться (фотошопом) всякий раз, когда есть 100% прозрачность только для экономии места на диске.
Арс Магика
Не уверен, что это на самом деле отвечает на вопрос - похоже, специфично для обработки PNG.
e100
2

Я узнал, как сделать это в GIMP, это может быть не PhotoShop, но, по крайней мере, он будет делать то, что вы просите. (Как бы я это ни интерпретировал;))

  • Откройте изображение в GIMP.
  • Нажмите с правой MouseButton на слой в слоях коробки
  • Выберите « добавить маску слоя » из контекстного меню
  • В следующем меню выберите « передать слои альфа-канал » и нажмите кнопку « Добавить »

В этот момент у вас остается изображение с маской альфа-канала.

Вы можете пойти еще дальше:

  • Щелкните правой кнопкой мыши маску слоя и выберите « Удалить маску слоя ».
  • Теперь вы остались с изображением без альфа-маски.

Есть также клип на YouTube, как это сделать.

Роберто Де Виво
источник
Роберто: Да, вы нашли ответ. Это именно то, что мы хотим, и это бесплатно! Я буду использовать видео, которое вы разместили, в качестве ответа для любого другого человека, спрашивающего то же самое (до сих пор возможно только путем бесконечного дублирования слоя в PS)
1

Это кажется ошеломляюще сложным. Если я правильно понимаю исходный вопрос и его различные пояснения, проблема заключается в том, чтобы взять любое произвольное изображение, содержащее прозрачность, и сделать его полностью непрозрачным, а затем применить исходные альфа-значения в качестве маски, чтобы воссоздать исходный внешний вид.

Если это вопрос, то это очень простой ответ, хотя и немного утомительный.

  1. Скопируйте слой 10 раз. Прозрачность «заполнится» в составном изображении.

  2. Объедините все копии (но НЕ оригинальный слой , который вам понадобится для последних шагов).

  3. Повторите шаги 1 и 2 с объединенным слоем, затем повторите это снова. На этом этапе все пиксели, которые были прозрачны менее чем на 100%, теперь становятся непрозрачными на 100% (если есть некоторые отклонения, просто повторяйте процесс, пока их нет). Это столько информации об изображении, сколько возможно восстановить.

  4. Ctl / Cmd-Нажмите на эскиз исходного слоя, чтобы загрузить его прозрачность.

  5. Выбрав новый непрозрачный слой, щелкните значок маски слоя на панели «Слои».

Алан Гилбертсон
источник
0

Хорошо, это на самом деле довольно просто (вы должны игнорировать марширующих муравьев)

Создайте новый слой и полностью залейте его тем цветом, который вы используете (если при выборке берете его из мертвой точки первого изображения)

введите описание изображения здесь

введите описание изображения здесь

Затем возьмите свое первое изображение и нажмите CTRL + клик по миниатюре слоя, вы должны увидеть некоторую версию этого: введите описание изображения здесь

Как я уже говорил: игнорируйте марширующих муравьев, в CS5 автоматически появляется растушевка.

Затем убедитесь, что у вас выбран заполненный слой и нажмите кнопку маски:

введите описание изображения здесь

Затем просто скройте нижний слой, и все готово, с тем эффектом, который вам нужен :)

введите описание изображения здесь

И это как перепроектировать прикладную маску в CS5. Функция выбора слоя CS5 довольно продвинутая, поэтому большую часть времени просто игнорируйте марширующих муравьев, так как они не показывают правильно какие-либо растушевки, которые будут происходить с выделением :)

Надеюсь, что это работает для вас.

рукав моря
источник
спасибо за ваш ответ, но это не то, что я ищу - как объяснено, постоянный красный только для этого примера! это может быть ЛЮБОЕ изображение (не только постоянный цвет заливки) - и, разумеется, у меня нет оригинального непрозрачного изображения
Мат
Ну, вы должны опубликовать свое изображение в вашем вопросе. Если вы разместите постоянное заполнение, мы ответим на основе постоянного заполнения. Попытайтесь использовать методы здесь, хотя, выбор CS5 очень продвинут, это может удивить вас. Это сделал я.
Кайл
Конечно, я знаю об этих методах отбора! проблема заключается в том, как получить доступ к RGB только части прозрачного слоя
Мат
Над слоями есть три вкладки, нажмите каналы. Там у вас есть красная, зеленая, синяя и многослойная маска. Может быть, это то, что вы после?
Кайл
но слой, как в neo.cycovery.com/alpha_prob2.jpg , не показывает альфа-канал - вместо этого он просто отображает каналы RG и B с уже примененной прозрачностью
Мат
0

То, что вы хотите сделать, легко сделать с помощью плагина, например, плагина Photofreebies «Remove Transparency». Сначала вы щелкаете кнопкой мыши по слою, чтобы выбрать прозрачные пиксели, затем сохраните эту информацию о прозрачности в новом канале, чтобы сохранить ее. Затем вы применяете фильтр «Удалить прозрачность» и видите, что «скрытые» пиксели в вашем слое становятся непрозрачными (довольно интересно посмотреть, как Photoshop разметит ваши 100% прозрачные пиксели BTW). Я действительно хотел бы годами, чтобы это было встроено в Photoshop изначально, но, увы, слишком продвинутый, я думаю.

К сожалению, я не могу найти Photoshop CS6-совместимую версию такого плагина для Mac, поэтому я застрял прямо сейчас. GraphicConverter может сделать это тоже (удалить альфа-канал).

zmippie
источник
0

Вот ответ:

  1. Сделайте слой с материалом, который вы хотите на изображении.

  2. Сделайте выбор для желаемого альфа-канала.

  3. Сделайте выделение «маской слоя» для слоя изображения.

  4. Щелкните правой кнопкой мыши маску слоя и «Применить маску слоя».

Теперь волшебство начинается:

  1. Перейдите в «Слой», а внизу: «Матирование», затем выберите «Удалить черный матовый».

Добро пожаловать!

Счет за электричество
источник