2013-04-13 7 views
7

मुझे यह निर्धारित करने की आवश्यकता है कि एक पीएनजी छवि में कोई पारदर्शिता है या नहीं - यह प्राप्त करने के लिए सबसे कुशल कोड क्या होगा?किसी छवि में पारदर्शिता का पता लगाने

+2

यह एक दयालु बात है कि एसओ उन व्यक्तियों द्वारा ओवरराउन हो रहा है जिनके पास वोटों के अलावा योगदान और वैध प्रश्नों के करीबी अनुरोधों के अलावा योगदान करने के लिए कुछ भी नहीं है। आपके महान उत्तर के लिए @Sten धन्यवाद। – RunLoop

उत्तर

13

पीएनजी को पिक्सेलबफर में कनवर्ट करें और रंग वितरण के हिस्टोग्राम की गणना करने के लिए विमेज का उपयोग करें। फिर अल्फा चैनल हिस्टोग्राम की जांच करें। पिक्सल के माध्यम से एक-एक करके जाने से अधिक तेज़ है।

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 आदेश दिया जाता है। यदि आपके पास कुछ और है, उदा। बीजीआरए, आप बस हिस्टोग्राम [3] [i] की जांच करें।

यहां तक ​​कि तेजी से शायद पहली vImageConvert_ARGB8888toPlanar8 का उपयोग कर चार प्लानर बफ़र्स में बफर विभाजित करने के लिए और फिर बस vImageHistogramCalculation_Planar8 का उपयोग कर अल्फा बफर पर हिस्टोग्राम गणना करते हैं।

यदि आप आईओएस 7 पर हैं और बाद में आप एक सीजीआईमेज के रूप में पीएनजी खोल सकते हैं और इसे सीधे वीमेज बफर में परिवर्तित करने के लिए vImageBuffer_initWithCGImage का उपयोग कर सकते हैं (डब्ल्यूडब्ल्यूडीसी 2014 में सत्र 703 देखें)।

अंत में, हिस्टोग्राम की गणना करने के लिए कोर छवि का उपयोग करने का एक विकल्प होगा।

संबंधित मुद्दे