Apenas na teoria: Como é o componente alfa premultiplied para os outros componentes de um PNG no iPhone OS, e como ele pode ser unpremultiplied corretamente?

StackOverflow https://stackoverflow.com/questions/870690

Pergunta

Na verdade, eu pensei que não haveria uma maneira fácil de conseguir isso. O que eu preciso é uma informação valor alfa puro. Para os testes, eu tenho um 50 x 55 px PNG, onde em cada extremidade um pixel retângulo 5x5 é totalmente transparente. Nessas áreas alfa tem que ser 0.Everywhere outra coisa que tem que ser 255. Eu fiz muito certo de que o meu PNG é criado corretamente, e também parece corretamente.

Por favor me diga se isso é teoricamente correta: Criei um CGImageRef que tem apenas o canal alfa e nada mais. Isto é feito com CGBitmapContextCreate e kCGImageAlphaOnly como param. CGBitmapContextGetBitsPerPixel (contexto) me retorna 1, por isso me indica que eu realmente tem apenas um componente por pixel: O desejado alfa valor. Estive lendo que CGBitmapContextCreate vai lidar com toda a conversão da imagem dada ao novo contexto criado. Minha imagem estava previamente PNG-24 com transparência, mas pngcrunch de Xcode parece convertê-los de alguma forma.

Assim, apenas na teoria: Eu tenho alguma chance de chegar ao alpha correta, unpremultiplied neste momento? Os valores que recebo parecem quase iguais, mas em um grande 5x5 quadrado transparente recebo valores como 19, 197, 210, 0, 0, 0, 98 e assim por diante. Se fosse verdade, eu teria que ver algo a partir da imagem. A imagem em si é totalmente azul.

Foi útil?

Solução

Premultiplication não afeta o canal alfa, que afeta os canais de cor.

A fórmula para raster composição (colocando uma imagem raster sobre a outra) é:

dst.r = src.r * src.a + dst.r * (1.0 - src.a);
dst.g = src.g * src.a + dst.g * (1.0 - src.a);
dst.b = src.b * src.a + dst.b * (1.0 - src.a);

cortes Premultiplication fora a primeira expressão multiplicação:

dst.r = src.r′ + dst.r * (1.0 - src.a);
dst.g = src.g′ + dst.g * (1.0 - src.a);
dst.b = src.b′ + dst.b * (1.0 - src.a);

Isso funciona porque os componentes de cor de origem já são multiplicados pelo alfa componente-daí o nome “premultiplied”. Ela não precisa de multiplicá-los agora, porque ele já tem os resultados.

unpremultiplied alfa

O componente alfa em si nunca é premultiplied: O que você multiplicá-lo por? O cor componentes são premultiplied pelo alfa .

Outras dicas

Desde premultiplying valores de cor é um simples como:

r = (r * a) / 255;
g = (g * a) / 255;
b = (b * a) / 255;

Obtendo o inverso seria:

if (a > 0) {
    r = (r * 255) / a;
    g = (g * 255) / a;
    b = (b * 255) / a;
}

Esta formular não é correto. O objetivo é encontrar unmultiplexed (r, g, b) que este último resultado com os mesmos valores multiplexados (não é possível encontrar o r original, g, b valores, no entanto.

No entanto, com a formular acima encontramos para o exemplo de

alpha = 100
r_premulti = 1

a r reconstruída = 2;

Últimos se este r é multiplexada novamente encontramos 2 * 100/255 = 0 mas queríamos r_premulti == 1 em vez !!

As necessidades Formular corretas para -se redonda . Exemplo para r-componente:

reconstruced r = ceiling(r_premulti * 255 / alpha)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top