2012-10-18 4 views

risposta

7

In breve, premoltiplicato significa che il valore alfa influenzerà anche i valori dei componenti di colore dei pixel quando viene rappresentato un pixel che non è opaco.

Dalla guida disegno Quartz 2D:

Per bitmap che hanno una componente alfa, se i componenti del colore sono già moltiplicate per il valore alfa. Premoltiplied alpha descrive un colore di origine i cui componenti sono già moltiplicati per un valore alfa . Il precomplesso accelera il rendering di un'immagine di eliminando un'operazione di moltiplicazione extra per componente di colore. Nell'esempio , in uno spazio cromatico RGB, il rendering di un'immagine con alphapremoltiplicato elimina tre operazioni di moltiplicazione (tempi rossi alfa, volte alfa verde e blu volte alfa) per ciascun pixel nell'immagine.

BTW, Pre-Multiplied è probabilmente quello che le API ti obbligheranno a utilizzare perché questa è la preferenza di Quartz. Fortunatamente, le conversioni non sono terribili (perdita di OTOH ...).


la via più breve per spiegare questo è in float componenti, utilizzando la gamma [0...1].

Se la nostra rappresentazione di ingresso RGBA è:

typedef struct t_rgba { float r,g,b,a; } t_rgba; 
const t_rgba rgba = { 0.5, 0.5, 0.5, 0.5 }; 

Poi di controllare la validità moltiplicarlo:

t_rgba rgba_PreMul = rgba; 
rgba_PreMul.r *= rgba_PreMul.a; 
rgba_PreMul.g *= rgba_PreMul.a; 
rgba_PreMul.b *= rgba_PreMul.a; 

Poi a de-pre-moltiplicarlo:

t_rgba rgba_DePreMul = rgba_PreMul; 
if (0.0 < rgba_DePreMul.a && 1.0 > rgba_DePreMul.a) { 
    const float ialpha = 1.0/rgba_DePreMul.a; 
    rgba_DePreMul.r *= ialpha; 
    rgba_DePreMul.g *= ialpha; 
    rgba_DePreMul.b *= ialpha; 
} 

si potrebbe voglio anche un po 'di saturazione.

Questa è la forma base, che può essere riproposta ad altre rappresentazioni numeriche. Tieni presente che queste conversioni sono in perdita. Inoltre, fai attenzione a non superare le bitmap premoltiplicate in cui sono previste normali bitmap e viceversa.

+1

Ho il pixel [(255/255,0), (100/255,0), (20/255,0), (40/255,0)]. Se capisco correttamente 'premoltiplied' significa che' red * = (40/255.0) 'e così via, ma quando uso' kCGImageAlphaFirst' quindi 'red = red'? –

+1

@TomaszSzulc si. e ampliato. – justin

+1

Grazie mille. –

Problemi correlati