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.