2013-04-13 3 views
7

png画像に透明度が含まれているかどうかを判断する必要があります。これを達成するための最も効率的なコードは何でしょうか?画像の透明度を検出する

+2

正当な質問に投票したり、正当な質問をしたりするだけでなく、寄付することのない個人によってSOが氾濫しているのは残念です。あなたの素晴らしい答えのために@Stenに感謝します。 – RunLoop

答えて

13

pngをピクセルバッファに変換し、vimageを使用してカラー分布のヒストグラムを計算します。その後、アルファチャンネルヒストグラムを確認します。 vimageは1つずつピクセルを通過するよりはるかに高速です。

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、代わりにhistogram [3] [i]をチェックするだけです。

vImageConvert_ARGB8888toPlanar8を使用してバッファを4つのプレーンバッファに分割してから、vImageHistogramCalculation_Planar8を使用してアルファバッファのヒストグラム計算を行うだけです。

iOS7以降では、pngをCGImageとして開き、vImageBuffer_initWithCGImageを使用してvimageバッファに直接変換できます(WWDC 2014のセッション703を参照)。

最後に、Core Imageを使用してヒストグラムを計算する方法もあります。

関連する問題