我使用此代码,但速度很慢。还有其他办法吗? 我尝试使用方法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;
}
}
答案 0 :(得分:0)
我认为您应首先查看图片的size
。如果两个图像的size
和scale
相等,则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
比本例中的其他所有内容都要快。