A transparência é multiplicada por, não adicionada ao pixel original para obter o pixel misto. Veja a discussão no Especificação do PNG .
Supondo que amostras de cores de 8 bits variem de 0..255 e normalizando para o intervalo 0..1.0, faça isso para cada pixel na imagem:
m = Mix/255
p = Picture/255
a = alpha = Transparency/255
m = (p * a) + (b * (1.0 - a))
Resolva "a"
a = (m - b) / (p - b)
Converter de volta ao intervalo original, por exemplo, 0..255:
Transparency = a * 255
Infelizmente, isso significa que você não pode extrair transparência (alfa) de todos os pixels. Em particular, quando Imagem == Fundo (p - b == 0), então Transparência pode ser qualquer coisa no intervalo 0..255 (a == qualquer coisa de 0.0 a 1.0); se você usar essa fórmula em um código que precisa proteger contra divisão por zero.
Quando o fundo da imagem é diferente de zero, você pode obter Transparência, mas não é muito preciso quando a diferença (p-b) é pequena.