Solo in teoria: Come è la componente alfa premoltiplicato nelle altre componenti di un PNG in iPhone OS, e come può essere unpremultiplied correttamente?

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

Domanda

In realtà, ho pensato che ci sarebbe stato un modo semplice per raggiungere questo obiettivo. Ho bisogno di informazioni puro valore alfa. Per il test, ho un 50 x 55 px PNG, dove ad ogni fronte di un pixel 5x5 rettangolo è completamente trasparente. In queste aree alfa deve essere 0.Everywhere altro deve essere 255. Ho fatto molto sicuro che il mio PNG è creata correttamente, e sembra anche in modo corretto.

La prego di dirmi se questo è teoricamente corretto: Ho creato un CGImageRef che ha solo il canale alfa e nient'altro. Questo viene fatto con CGBitmapContextCreate e kCGImageAlphaOnly come param. CGBitmapContextGetBitsPerPixel (contesto) mi restituisce 1, in modo che mi indica che ho davvero un solo componente per pixel: il valore alfa desiderato. Ho letto che CGBitmapContextCreate gestirà tutte la conversione da l'immagine data al nuovo contesto creato. La mia immagine è stato precedentemente PNG-24 con trasparenza, ma pngcrunch da Xcode sembra convertirli in qualche modo.

Quindi, solo in teoria: Devo alcuna possibilità di arrivare alla corretta, alfa unpremultiplied a questo punto? I valori ottengo sembrano quasi partita, ma in un quadrato trasparente grande 5x5 ottengo valori come 19, 197, 210, 0, 0, 0, 98 e così via. Se fossero vere, avrei dovuto vedere qualcosa dall'immagine. L'immagine stessa è blu fisso.

È stato utile?

Soluzione

premoltiplicazione non influisce sul canale alfa, colpisce i canali di colore.

La formula per raster composizione (mettendo un'immagine raster su un'altra) è:

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

tagli premoltiplicazione fuori la prima espressione moltiplicazione:

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

Questo funziona perché i componenti colore origine sono già moltiplicati per il componente alfa-da cui il nome “premoltiplicato”. Essa non ha bisogno di moltiplicare le loro adesso, perché ha già i risultati.

  

alfa unpremultiplied

Il componente alfa in sé non è mai premoltiplicati: Cosa vorresti moltiplicarlo per? Il color componenti sono premoltiplicati dal alpha .

Altri suggerimenti

Dal premoltiplicazione valori dei colori è un semplice come:

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

Come l'inverso potrebbe essere:

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

Questo formulario non è corretto. L'obiettivo è di trovare unmultiplexed (r, g, b) che avrebbe Quest'ultimo risultato agli stessi valori multiplex (non è possibile trovare il r originale, g, valori di b, però.

Tuttavia, con il formulario di cui sopra troviamo per l'esempio di

alpha = 100
r_premulti = 1

a r ricostruito = 2;

Ultimi se questo r è multiplato volta troviamo 2 * 100/255 = 0 ma volevamo == r_premulti 1 invece !!

e la correttezza formulario ha bisogno di Round Up . Esempio per r-componenti:

reconstruced r = ceiling(r_premulti * 255 / alpha)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top