Objective c 如何判断CGImageRef是否完全为空?

Objective c 如何判断CGImageRef是否完全为空?,objective-c,core-graphics,opacity,cgimage,Objective C,Core Graphics,Opacity,Cgimage,我正在写一个Objective-C算法,比较两幅图像并输出差异 偶尔会传入两个相同的图像。有没有办法从生成的CGImageRef立即判断它不包含任何数据?(即,仅透明像素) 该算法以>20 fps的速度运行,因此性能是最高优先级。对此不确定,但如果您可以拥有一张完全空白的样本图像,那么 UIImage *image = [UIImage imageWithCGImage:imgRef]; //imgRef is your CGImageRef if(blankImageData == nil)

我正在写一个Objective-C算法,比较两幅图像并输出差异

偶尔会传入两个相同的图像。有没有办法从生成的CGImageRef立即判断它不包含任何数据?(即,仅透明像素)


该算法以>20 fps的速度运行,因此性能是最高优先级。

对此不确定,但如果您可以拥有一张完全空白的样本图像,那么

UIImage *image = [UIImage imageWithCGImage:imgRef]; //imgRef is your CGImageRef
if(blankImageData == nil)
{
    UIImage *blankImage = [UIImage imageNamed:@"BlankImage.png"]; 
    blankImageData = UIImagePNGRepresentation(blankImage); //blankImageData some global for cache
}

// Now comparison
imageData = UIImagePNGRepresentation(image);// Image from CGImageRef
if([imageData isEqualToData:blankImageData])
{
   // Your image is blank
}
else
{
   // There are some colourful pixel :)
}

从性能角度来看,您应该将此检查合并到比较算法中。处理图像时最昂贵的操作通常是将一小段图像加载到缓存中。一旦你得到了它,有很多方法可以非常快速地处理数据(),但问题是你需要随时用新数据逐出并重新加载缓存,这在计算上是非常昂贵的。现在,如果您已经在算法中对两幅图像的每个像素都进行了一次检查,那么在缓存中仍有数据的情况下,同时计算像素是有意义的。所以在伪代码中:

int total_sad = 0
for y = 0; y < heigth; y++
  for x = 0; x < width; x+=16
    xmm0 = load_data (image0 + y * width + x)
    xmm1 = load_data (image1 + y * width + x)

    /* this stores the differences (your algorithm) */
    store_data (result_image + y * width + x, diff (xmm0, xmm1))
    /* this does the SAD at the same time */
    total_sad += sad (xmm0, xmm1)
if (total_sad == 0)
  print "the images are identical!"
int total\u sad=0
对于y=0;y<高度;y++
对于x=0;x<宽度;x+=16
xmm0=加载_数据(图像0+y*宽度+x)
xmm1=加载_数据(图像1+y*宽度+x)
/*这将存储差异(您的算法)*/
存储数据(结果图像+y*宽度+x,差异(xmm0,xmm1))
/*这同时也带来了悲伤*/
总sad+=sad(xmm0,xmm1)
如果(总计=0)
打印“图像相同!”

希望能有所帮助。

您应该选择CoreImage。 看看“CIArea*”过滤器

请参见此处的核心图像过滤器参考:

这将比以前的任何方法都要快得多。
让我们知道这是否适合您。

听起来是个好主意。因为我们将它与空白图像进行比较,所以我想知道循环并与零进行比较是否更快。(也是为OSX编写的,所以UIImage不可用,但我明白了!)不确定您还有多少时间,但我很想看看通过基准测试哪一个会更快:)。循环通过也应该工作。有没有可能在图像上有一个特定区域,如果不是空的话,像素将被100%地画出来?你也可以开发这样的启发式来增强循环,比如如果生成的图像不是全息图。然后检查exat center中的像素。如果画的是图片,则中心的像素具有颜色的可能性更高。但这很危险…你必须检查边缘情况。好主意。对于我的用例,透明/不透明位将是完全随机的,并且分布在图像周围。你的想法可能会帮助下一个人!谢谢你周到的反馈。很酷,为了得到更多的反馈,我抛出了100个代表奖金。谢谢Chrisi如果你想让它快速运行,一定要查看加速框架。里面有很多DSP和矢量处理功能,而且速度非常快。天哪,真是难以置信!这正是我们所需要的。非常感谢你!如果性能是您关注的焦点,则速度仍将大大加快。