0

感謝您花時間閱讀此內容。我試圖加速一些我後來寫的代碼。在XCode中使用工具我發現主要的瓶頸在於此方法,特別是getPixel調用。基本上我的方法需要兩個NSBitmapImageRep對象,並逐個比較它們以尋找差異。有沒有人對下面或者其他方法有任何建議?謝謝。是否有更快速的方式來逐個比較NSBitmapImageRep對象

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

    //尋找明顯的差異,即:寬度和高度差... NSSize imageASize = [imageRepA尺寸]; NSSize imageBSize = [imageRepB size]; if((imageASize.width!= imageBSize.width)||(imageASize.height!= imageBSize.height)){ return NO; }

    //現在開始看每個點 NSUInteger pixelOfA [3];
    NSUInteger pixelOfB [3];

    對(INT行= 0;行<(imageASize.height);行=行1){ 對(INT COL = 0;西<(imageASize.width); COL =欄1){ [imageRepA getPixel:pixelOfA atX:row y:col]; [imageRepB getPixel:pixelOfB atX:row y:col];

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

    }

    返回YES; }

回答

1

蒙蒂,當你像你這樣用密集的循環,你不應該使用大量的OBJ-C調用。

NSBitmapImageRep包含一個CGImage引用。你可以使用CFEqual來比較2 CFStruct,這是CGImage。之後,你只需要穿過你的手指,CGImage上的平等就是關於像素,chanel,位圖信息等等......我不知道兩個相同的圖像在概念上是什麼相同的。但是爲了做你想做的事,你在這裏有很多工具。

對不起,如果這實際上不是一個迴應,但我給你很大的提示,你應該完成你想要的東西。

+0

謝謝Bonjour先生。我會在接下來的幾天裏探討一些你的建議並回報。欣賞指針:) – Monty

+0

您好先生Bonjour,我探討了使用CGImageRef建議和速度加倍:)我無法獲得CFEqual工作,所以而不是比較每個CGImageRef中實際存儲在CFDataRef中的字節(CGImageRef內部)。獲取CFDataRef來比較字節是一個非常昂貴的操作。我正在使用函數CGDataProviderCopyData(...)來做到這一點。你能提出另一種方法或解釋我如何使用CFEqual比較CGImages? – Monty

+1

好吧,我現在明白爲什麼CFEqual似乎沒有工作。這是因爲除了存儲在CGImageRef中的像素數據(比如bitsPerPixel)之外還有其他屬性,並且CFEqual將它們全部進行比較。對於其他尋找比較圖像的快速方法的人來說,使用CFImageRef的「對象」而不是他們的NS ...對象並調用CFEqual來比較它們。確保您意識到CFEqual將比較所有屬性,而不僅僅是像素數據。感謝Bonjour先生,你讓我走向正確的方向:) – Monty

相關問題