【问题标题】:Is there a faster way to compare NSBitmapImageRep objects pixel by pixel?有没有更快的方法来逐像素比较 NSBitmapImageRep 对象?
【发布时间】:2013-10-23 06:30:15
【问题描述】:

我正在尝试加快我不久前编写的一些代码。

在 Xcode 中使用工具我发现主要瓶颈在于此方法,尤其是 getPixel 调用。

- (BOOL)fasterCompareImage:(NSBitmapImageRep *)imageRepA IdenticalTo:(NSBitmapImageRep *)imageRepB {

    // look for obvious differences ie: width and height differences...
    NSSize imageASize = [imageRepA size];
    NSSize imageBSize = [imageRepB size];
    if( (imageASize.width != imageBSize.width) || (imageASize.height != imageBSize.height) ) {
        return NO;
    }

    // now start looking at each point
    NSUInteger pixelOfA[3];  
    NSUInteger pixelOfB[3];  

    for (int row = 0; row < (imageASize.height); row = row +1) { 
        for(int col = 0; col < (imageASize.width); col = col +1) { 
            [imageRepA getPixel:pixelOfA atX:row y:col];
            [imageRepB getPixel:pixelOfB atX:row y:col];

            if(pixelOfA[1] != pixelOfB[1]) {  
                return NO;
            }
        }
    }

    return YES;
}

基本上,我的方法采用两个 NSBitmapImageRep 对象并逐个像素地比较它们以查找差异。

是否有人对代码有任何建议或可能有不同的方法?

【问题讨论】:

    标签: objective-c performance core-graphics getpixel nsbitmapimagerep


    【解决方案1】:

    Monty,当你像以前那样使用密集循环时,你不应该使用大量的 obj-c 调用。

    NSBitmapImageRep 持有一个 CGImage 引用。您可以使用 CFEqual 来比较 2 个 CFStruct,即 CGImage。在那之后,你只需要交叉手指,CGImage 上的平等是关于像素、香奈儿、位图信息等等......我不知道概念上两个相同的图像是什么。但是你有很多工具可以做你想做的事。

    对不起,如果这实际上不是一个回应,但我给你很大的提示,你应该如何完成你想要的。

    【讨论】:

    • 谢谢卓悦先生。在接下来的几天里,我将探讨您的一些建议并进行报告。欣赏指针:)
    • 您好,Bonjour 先生,我按照建议使用 CGImageRef 进行了探索,速度翻了一番 :) 我无法让 CFEqual 正常工作,因此一直在比较实际存储在 CFDataRef 中的每个 CGImageRef 中的字节( CGImageRef 内)。让 CFDataRef 比较字节是一项非常昂贵的操作。我正在使用函数 CGDataProviderCopyData(...) 来执行此操作。您能否提出另一种方法或解释我如何使用 CFEqual 来比较 CGImages?
    • 好吧,我现在明白为什么 CFEqual 似乎不起作用了。这是因为CGImageRef中除了存储像素数据之外还有其他属性(例如bitsPerPixel),CFEqual将它们全部进行比较。对于正在寻找一种非常快速的方法来比较图像的其他人,请使用 CFImageRef 'objects' 而不是它们的 NS... 对应物并调用 CFEqual 来比较它们。确保您意识到 CFEqual 将比较所有属性,而不仅仅是像素数据。感谢 Bonjour 先生,您让我朝着正确的方向前进 :)
    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 2020-02-26
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 2014-08-10
    • 1970-01-01
    相关资源
    最近更新 更多