gpt4 book ai didi

ios - 检测图像中的透明度

转载 作者:可可西里 更新时间:2023-11-01 03:06:01 26 4
gpt4 key购买 nike

我需要确定 png 图像是否包含任何透明度 - 实现此目的的最有效代码是什么?

最佳答案

将 PNG 图像转换为像素缓冲区并使用 vimage 计算颜色分布的直方图。然后检查 alpha channel 直方图。 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);

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 将缓冲区分成四个 FlatBuffers ,然后使用 vImageHistogramCalculation_Planar8 对 alfa 缓冲区进行直方图计算。

您可以将 PNG 图像作为 CGImage 打开并使用 vImageBuffer_initWithCGImage 将其直接转换为 vimage 缓冲区(参见 WWDC 2014 上的 session 703)。

最后,另一种方法是使用 Core Image 来计算直方图。

关于ios - 检测图像中的透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15985996/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com