检查比较UIImages

时间:2014-05-25 10:34:45

标签: ios uiimageview uiimage

我使用此代码,但速度很慢。还有其他办法吗? 我尝试使用方法indexOfObject和containsObject用于图像数组,但它不适用于我。

        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;
            }
        }

1 个答案:

答案 0 :(得分:0)

我认为您应首先查看图片的size 。如果两个图像的sizescale相等,则check the pixel data directly表示相等,而不是图像PNG表示。这会快得多。 (该链接显示如何获取像素数据。要进行比较,请使用memcmp。)

从该帖子(稍加修改):

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];
}

关于为什么这更快:UIImagePNGRepresentation(1)获取原始二进制数据,然后(2)将其转换为PNG格式。跳过第二步只能提高性能,因为它比完成第1步要多得多。memcmp比本例中的其他所有内容都要快。