2014-05-25 5 views
0

이 코드를 사용하지만 속도가 매우 느립니다. 그것을 할 다른 방법이 있습니까? 이미지의 배열에 indexOfObject 및 containsObject 메서드를 사용해 보았지만 나에게 적합하지 않습니다.UIImages 비교 확인

 BOOL haveDublicate = NO; 
     UIImage *i = [ImageManager imageFromPath:path]; 
     NSArray *photoImages = [ImageManager imagesFromPaths:photoPaths]; 
     for (UIImage *saved in photoImages) 
     { 
      if ([ UIImagePNGRepresentation(saved) isEqualToData: 
       UIImagePNGRepresentation(i) ]) 
      { 
       haveDublicate = YES; 
      } 
     } 
+0

바이트 단위로 데이터를 보는 대신, 데이터의 * 크기 *를 확인하고 같을 경우에만 "isEqualToData :"를 확인하십시오. –

+0

-isEqualToData : 이미 그렇게합니다. 느린 부분은 UIImagePNGRepresentation입니다. – Michael

+0

하지만 아마도 데이터를 확인하기 전에 이미지의 크기를 비교하는 것이 좋은 생각 일 것입니다 ... 어쨌든 당신은 어쨌든 그것을 의미했습니다 ... – Michael

답변

0

내가 먼저 이미지의 size확인한다고 생각합니다. 두 이미지의 sizescale이 같으면 check the pixel data directly이 같고 이미지 PNG 표현이 동일하지 않습니다. 이것은 훨씬 더 빠를 것이다. (. 링크는 픽셀 데이터를 가져 오는 방법을 보여줍니다 비교하려면 memcmp를 사용합니다.)

을 (약간 수정) 해당 게시물에서 : UIImagePNGRepresentation (1) 인출 :이 빠른 이유에 대해

NSData *rawDataFromUIImage(UIImage *image) 
{ 
    assert(image); 

    // Get the image into the data buffer 
    CGImageRef imageRef = [image CGImage]; 
    NSUInteger width = CGImageGetWidth(imageRef); 
    NSUInteger height = CGImageGetHeight(imageRef); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    int byteSize = height * width * 4; 
    unsigned char *rawData = (unsigned char*) malloc(byteSize); 
    NSUInteger bytesPerPixel = 4; 
    NSUInteger bytesPerRow = bytesPerPixel * width; 
    NSUInteger bitsPerComponent = 8; 
    CGContextRef context = CGBitmapContextCreate(rawData, width, height, 
        bitsPerComponent, bytesPerRow, colorSpace, 
        kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
    CGColorSpaceRelease(colorSpace); 

    CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); 
    CGContextRelease(context); 
    return [NSData dataWithBytes:rawData length:byteSize]; 
} 

원시 이진 데이터와 (2) PNG 형식으로 변환합니다. 두 번째 단계를 건너 뛰는 것은 1 단계를 수행하는 것보다 훨씬 많은 작업이므로 성능을 향상시킬 수 있습니다. memcmp은이 예제의 다른 모든 것보다 빠릅니다.

+1

또한 'i'밖에 픽셀 데이터를 가져와야합니다. 이 변경되지 않습니다 루프의. 위의 원래 코드에서는 매번 png 데이터를 가져 오므로 UIImagePNGRepresentation (i)을 루프 외부로 이동하면 즉시 두 배의 속도가 향상됩니다. 또 다른 최적화는 중복을 찾은 후 루프를 중단하는 것입니다 ('break'문을 추가하십시오). 그렇지 않으면 복제 이미지를 찾은 후에 다른 모든 이미지를 계속 검사하게됩니다. – NigelG

+0

@NigelG 맞아. 이렇게하면 최대 100 % 속도가 향상됩니다. – Michael