Puoi spiegarmi la differenza tra kCGImageAlphaPremultipliedFirst
e kCGImageAlphaFirst
? Cosa significa in pratica Premultiplied
?kCGImageAlphaPremultipliedFirst e kCGImageAlphaFirst
risposta
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.
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'? –
@TomaszSzulc si. e ampliato. – justin
Grazie mille. –