2013-04-13 3 views
7

Мне нужно определить, содержит ли png-изображение любую прозрачность - какой был бы наиболее эффективный код для достижения этого?Обнаружение прозрачности на изображении

+2

Жаль, что СО становится все более назойливым человеком, которому нечего вносить, кроме пустых голосов, и закрывать запросы на законные вопросы. Спасибо @Sten за отличный ответ. – RunLoop

ответ

13

Преобразование png в pixelbuffer и использование vimage для вычисления гистограмм цветовых распределений. Затем проверьте гистограмму альфа-канала. vimage намного быстрее, чем через пиксели один за другим.

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 предполагает, что цвета заказаны ARGB в буфере. Если у вас есть что-то еще, например. BGRA, вы просто проверяете гистограмму [3] [i].

Еще быстрее, возможно, сначала разбить буфер на четыре планарных буфера, используя vImageConvert_ARGB8888toPlanar8, а затем просто выполнить расчет гистограммы в буфере альфа, используя vImageHistogramCalculation_Planar8.

Если вы находитесь на iOS7, а позже вы можете открыть png как CGImage и использовать vImageBuffer_initWithCGImage, чтобы преобразовать его непосредственно в буфер vimage (см. Сеанс 703 на WWDC 2014).

Наконец, альтернативой будет использование Core Image для расчета гистограммы.

Смежные вопросы