Transparência para RGB + Alpha não multiplicado


16

Eu tenho uma camada transparente no Photoshop CS5 (portanto, internamente, é provavelmente armazenada como componente RGB não multiplicado mais um componente alfa por pixel).

Agora eu quero transformar isso em uma camada opaca (apenas RGB não-multiplicado) + uma máscara alfa. o resultado deve ser igual ao original.

Não posso simplesmente sublinhar a camada transparente com preto, pegar a seleção como uma máscara e mesclar as camadas, porque isso resultaria no alfa sendo pré-multiplicado nos valores RGB.

Espero que você entenda o problema e possa me dar uma solução para ele.

Como uma explicação alternativa: eu quero o processo REVERSE disso:

  1. crie uma nova camada e cole em qualquer imagem
  2. crie uma máscara com um gradiente de branco a preto
  3. aplique a máscara de camada

Imagens de explicação:

Estado A: insira a descrição da imagem aqui

Estado B: insira a descrição da imagem aqui


IMPORTANTE: a camada é apenas para este exemplo um vermelho totalmente constante - mas você pode pensar em qualquer imagem arbitrária em vez do vermelho constante. então - para ir do estado A ao estado B, basta aplicar a máscara de camada.

Quero saber como ir do estado B para o estado A.


Gostaria de saber se algum tipo de plug-in de máscara pode ajudar aqui. A informação da opacidade existe, é apenas uma questão de como obtê-la. A obtenção de informações no nível de pixel não existe nas APIs de script (pelo menos no Applescript, mas todos os idiomas suportados parecem se alinhar com o que eu vi).
— Philip Regan

Respostas:



5

Errado! Tudo errado!

Eu me enganei, e você também no processo: o que eu criei é de fato uma imagem pré-multiplicada - não pré-multiplicada por preto, mas por branco. Deixo esta resposta para que outros possam construir sobre ela.


Eu consegui fazer assim:

  1. Extrair canais RGBA verdadeiros da imagem
  2. Use-os para criar uma nova imagem

E aqui está como eu fiz isso:

imagem de teste

Esta é a imagem de teste que eu usei. A exibição do canal no PS é assim:

canais

Ao selecionar os canais individuais, copiei-os em camadas individuais e apliquei-os com um fundo branco para receber um mapa em preto e branco, como mostrado aqui:

bw-map

Eu também extraí a transparência da imagem original em uma camada, clicando com o comando na miniatura da camada e preenchendo uma nova camada com a seleção.

Então eu criei uma nova imagem com as mesmas dimensões e sem transparência. Em seguida, colei as camadas RGB criadas nos canais correspondentes na nova imagem:

novos canais de imagem

Na última etapa, cancelei a manutenção da camada clicando duas vezes e criei uma máscara de camada usando a camada alfa da imagem original, resultando no seguinte:

máscara de camada


Como afirmado acima, isso não cria uma imagem não pré-multiplicada, pois meu exemplo teria que parecer assim para não ser pré-multiplicado:

versão correta

Alguém é mais esperto que eu e pode criar isso? Acho que sem scripts avançados baseados em pixels, isso não é possível no Photoshop.



2

Com base nas respostas dadas e nos seus comentários, a resposta curta é: você não pode fazer o que deseja. Depois de aplicar a máscara, a camada é renderizada e os dados da imagem invisível são descartados.

EDITAR:

Criei alguns arquivos png de amostra e usei o php para manipulá-los (código-fonte abaixo).

Se eu criar um png com transparência aleatória e salvar enquanto a camada tiver uma máscara, as áreas 100% claras (como em uma ferramenta de caixa) serão exibidas em branco, independentemente de o suporte alfa ser ativado ou não. Gradientes que contêm uma quantidade de 100% de nitidez não aparecem com o alfa desativado.

Se eu aplicar a máscara de camada (permanentemente) e criar o png, o php exibirá a imagem original se o alfa estiver desativado.

Portanto, uma possível solução alternativa é encontrar um pacote de software que não suporte PNG alfa e salvá-lo a partir daí. Quanto à recuperação da máscara original, ainda não olhei para isso.

Ambos os exemplos de código são prova de conceito e 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);

?>

Para extrair o alfa (nota: php tem uma limitação GD de alfa de 128 níveis, em vez de 256), portanto, alguma precisão é perdida. O alfa pode ser esticado para 256 usando a ferramenta de níveis)

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

?>

mas os dados ainda estão lá. é a parte RGB dos dados de pixel RGBA. deve haver uma maneira de extraí-lo #
— 1510 Mat

1
por que você não fornece um arquivo de exemplo do mundo real? Na sua pergunta, você mostra claramente uma única camada com área transparente e sem máscara, nem indicação de um canal alfa.
— horatio

.png possui uma cor de paleta predefinida para preto 100% transparente, que provavelmente será usado (pelo photoshop) sempre que houver 100% de transparência apenas para economizar espaço em disco.
— Ars Magika

Não tenho certeza se isso realmente responde à pergunta - parece ser específico ao manuseio do PNG.
— e100

2

Descobri como fazê-lo no GIMP , pode não ser o PhotoShop, mas pelo menos fará o que você pede. (Como eu a interpreto de qualquer maneira;))

  • Abra a imagem no GIMP.
  • Clique com o botão direito do mouse na camada na caixa de camadas
  • Selecione " adicionar máscara de camada " no menu de contexto
  • No menu a seguir, selecione " canal alfa de transferência de camadas " e clique no botão " Adicionar "

Nesse ponto, você fica com uma imagem com uma máscara de canal alfa.

Você pode dar um passo adiante:

  • Clique com o botão direito na máscara de camada e selecione " Excluir máscara de camada "
  • Agora você fica com a imagem sem a máscara alfa.

Há também um clipe do youtube sobre como fazê-lo.


Roberto: Sim, você encontrou a resposta. É exatamente isso que queremos, e é grátis !! Vou usar o vídeo que você postou como a resposta para qualquer outra pessoa que solicita o mesmo (até agora só é possível por infinitamente duplicando a camada de PS)

1

Isso parece incrivelmente complexo. Se eu entendi a pergunta original e seus vários esclarecimentos corretamente, o problema é pegar qualquer imagem arbitrária que contenha transparência e torná-la totalmente opaca e aplicar os valores alfa originais como uma máscara para recriar a aparência original.

Se essa é a pergunta, é uma resposta muito simples, ainda que um pouco tediosa.

  1. Copie a camada 10 vezes. A transparência será "preenchida" na imagem composta.

  2. Mesclar todas as cópias (mas NÃO a camada original , necessária para as últimas etapas).

  3. Repita as etapas 1 e 2 com a camada mesclada e faça novamente. Neste ponto, todos os pixels que eram menos de 100% transparentes agora são 100% opacos (se houver alguns desvios, basta repetir o processo até que não haja nenhum). São tantas informações de imagem quanto possível de recuperar.

  4. Ctl / Cmd - Clique na miniatura da camada original para carregar sua transparência.

  5. Com a nova camada opaca selecionada, clique no ícone de máscara de camada no Painel Camadas.


0

Ok, isso é realmente muito simples (você precisa ignorar as formigas marchando)

Faça uma nova camada e preencha-a inteiramente com a cor que você estiver usando (se a amostragem a levar do ponto morto da primeira imagem)

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Em seguida, pegue sua primeira imagem e CTRL + Clique na miniatura da camada, você verá uma versão disso: insira a descrição da imagem aqui

Como eu disse antes: ignore as formigas que marcham, as penas entram em vigor automaticamente no CS5.

Em seguida, verifique se a camada preenchida está selecionada e clique no botão de máscara:

insira a descrição da imagem aqui

Em seguida, basta ocultar a camada inferior e você deve concluir, com o efeito exato que deseja: :)

insira a descrição da imagem aqui

E é assim que a engenharia reversa de uma máscara aplicada no CS5. A função de seleção de camadas do CS5 é bastante avançada, portanto, na maioria das vezes, ignora as formigas em marcha, pois elas não mostram corretamente nenhuma penugem que irá continuar com a seleção :)

Espero que funcione para você.


obrigado por sua resposta, mas não é isso que estou procurando - como explicado, o vermelho constante é apenas para este exemplo! Pode ser qualquer imagem (e não apenas uma cor de preenchimento constante) - e de corse eu não tenho a imagem pouco transparente originais disponíveis
— Mat

Bem, você deve postar sua imagem em sua pergunta. Se você postar um preenchimento constante, responderemos com base em um preenchimento constante. Tente usar as técnicas aqui, porém, a seleção do CS5 é muito avançada, pode surpreendê-lo. Isso me fez.
— Kyle

claro que eu sei sobre essas técnicas de seleção! o problema em questão é como acessar a RGB apenas parte de uma camada transparente
— Mat

Acima das camadas, existem três guias, clique em canais. Lá você tem vermelho, verde, azul e máscara de camada. Talvez seja isso que você está procurando?
— Kyle

mas uma camada como em neo.cycovery.com/alpha_prob2.jpg não mostra um canal alfa - em vez disso, apenas exibe os canais RG e B com a transparência já aplicada.
— Mat

0

O que você quer fazer é facilmente realizado por um plug-in, como o plug-in "Remover transparência" do PhotoFreebies. Primeiro, clique na camada para selecionar os pixels transparentes e, em seguida, salve essas informações de transparência em um novo canal para mantê-las por perto. Em seguida, você aplica o filtro "Remover transparência" e vê os pixels 'ocultos' em sua camada ficarem opacos (bastante interessante para ver como o Photoshop coloca seus pixels 100% transparentes entre BTW). Eu realmente desejo há anos que isso tenha sido incorporado nativamente ao Photoshop, mas, infelizmente, muito avançado, eu acho.

Infelizmente, não consigo encontrar uma versão compatível com o Photoshop CS6 de um desses plugins para o Mac, por isso estou preso no momento. O GraphicConverter também pode fazê-lo (remover canal alfa).


0

Aqui está a resposta:

  1. Faça uma camada com o material que você deseja na imagem.

  2. Faça uma seleção para o canal alfa desejado.

  3. Faça da seleção uma "máscara de camada" para a camada da imagem.

  4. Clique com o botão direito na máscara de camada e em "Aplicar máscara de camada".

Agora a mágica começa:

  1. Vá para "Camada" e, na parte inferior: "Esteira", depois escolha "Remover preto fosco".

Você é bem vindo!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.