9

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

4

1 に答える 1

19

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);

int trans = 255 //How little transparency you want to include
BOOL transparent = NO;      
for(int i=0; i<trans; i++){
   if(histogram[0][i]>0) transparent = YES;
}

vimage は、色がバッファ内で ARGB に順序付けられていることを前提としています。BGRA など、何か他のものがある場合は、代わりに histogram[3][i] を確認してください。

おそらく、最初に vImageConvert_ARGB8888toPlanar8 を使用してバッファーを 4 つの平面バッファーに分割し、次に vImageHistogramCalculation_Planar8 を使用してアルファ バッファーでヒストグラム計算を行うと、おそらくさらに高速です。

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

最後に、Core Image を使用してヒストグラムを計算することもできます。

于 2013-04-13T09:52:13.113 に答える