2013-04-13 16 views
7

Ho bisogno di determinare se un'immagine png contiene trasparenza - quale sarebbe il codice più efficiente per raggiungere questo obiettivo?Rilevamento della trasparenza in un'immagine

+2

È un peccato che SO venga invasa da individui che non hanno nulla da contribuire oltre a voti bassi e richieste ravvicinate a domande legittime. Grazie a @Sten per la tua grande risposta. – RunLoop

risposta

13

Converti il ​​png in un pixelbuffer e usa vimage per calcolare gli istogrammi delle distribuzioni di colore. Quindi controlla l'istogramma del canale alfa. il vimage è molto più veloce che passare attraverso i pixel uno per uno.

CVPixelBufferRef pxbuffer = NULL; 

vImagePixelCount histogramA[256]; 
vImagePixelCount histogramR[256]; 
vImagePixelCount histogramG[256]; 
vImagePixelCount histogramB[256]; 
vImagePixelCount *histogram[4]; 
histogram[0] = histogramA; 
histogram[1] = histogramR; 
histogram[2] = histogramG; 
histogram[3] = histogramB; 
vImage_Buffer vbuff; 
vbuff.height = CVPixelBufferGetHeight(pxbuffer); 
vbuff.width = CVPixelBufferGetWidth(pxbuffer); 
vbuff.rowBytes = CVPixelBufferGetBytesPerRow(pxbuffer); 

vbuff.data = pxbuffer; 
vImage_Error err=vImageHistogramCalculation_ARGB8888 (&vbuff,histogram, 0); 
if (err != kvImageNoError) NSLog(@"%ld", err); 

BOOL transparent;  
for(int i=1;i<256;i++){ 
    if(histogram[0][i]>0) transparent=YES; 
} 

vimage presuppone che i colori siano ordinati ARGB nel buffer. Se hai qualcos'altro, ad es. BGRA, basta controllare l'istogramma [3] [i].

È ancora più veloce dividere prima il buffer in quattro buffer planari utilizzando vImageConvert_ARGB8888perPlanar8 e quindi eseguire il calcolo dell'istogramma sul buffer alfa utilizzando vImageHistogramCalculation_Planar8.

Se si utilizza iOS7 e versioni successive è possibile aprire il png come CGImage e utilizzare vImageBuffer_initWithCGImage per convertirlo direttamente in un buffer vimage (vedere la sessione 703 al WWDC 2014).

Infine, un'alternativa sarebbe utilizzare Core Image per calcolare l'istogramma.

Problemi correlati