我正在尝试比较两个图像(实际上在较大的图像中找到一个较小的“子图像”),我正在使用下面提供的方法加载图像。
下面的代码现在包含一个测试for循环,它汇总了所有单个字节值。我发现这个总和及其字节有所不同,具体取决于它运行的设备。我的问题是为什么会发生这种情况?
// Black and white configuration:
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
NSUInteger bytesPerPixel = 1;
NSUInteger bitsPerComponent = 8;
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
// Image
CGImageRef imageRef = [[UIImage imageNamed:@"image.jpg"] CGImage];
NSUInteger imageWidth = CGImageGetWidth(imageRef);
NSUInteger imageHeight = CGImageGetHeight(imageRef);
NSUInteger imageSize = imageHeight * imageWidth * bytesPerPixel;
NSUInteger imageBytesPerRow = bytesPerPixel * imageWidth;
unsigned char *imageRawData = calloc(imageSize, sizeof(unsigned char));
CGContextRef imageContext = CGBitmapContextCreate(imageRawData, imageWidth, imageHeight, bitsPerComponent,
imageBytesPerRow, colorSpace, bitmapInfo);
// Draw the actual image to the bitmap context
CGContextDrawImage(imageContext, CGRectMake(0, 0, imageWidth, imageHeight), imageRef);
CGContextRelease(imageContext);
NSUInteger sum = 0;
for (int byteIndex = 0; byteIndex < imageSize; byteIndex++)
{
sum += imageRawData[byteIndex];
}
NSLog(@"Sum: %i", sum); // Output on simulator: Sum: 18492272
// Output on iPhone 3GS: Sum: 18494036
// Output on another 3GS: Sum: 18494015
// Output on iPhone 4: Sum: 18494015
free(imageRawData);
CGColorSpaceRelease(colorSpace);
答案 0 :(得分:2)
设备是否都运行相同版本的操作系统?另一种可能性(超出颜色空间,有人已经提到)是JPG解码库可能略有不同。由于JPEG是有损图像格式,因此不同的解码器会产生不相等的结果位图并不是不可想象的。考虑到在iOS UI中大量使用图像,假设JPG解码器正在经历不断的调整以获得最大性能,这似乎是合理的。
我甚至认为可以想象,在不同型号的设备(即不同的处理器)上运行的相同操作系统版本之间,如果有多个版本的JPG解码器,每个都经过大量优化,结果可能不相等。一个特定的CPU,虽然这不能解释相同型号的两个设备之间的区别,但是具有相同的操作系统。
您可能会尝试使用无损格式的图像重新运行实验。
值得指出的是,为CGBitmapContext提供自己的后备内存,但不对字对齐进行特殊限制可能会导致性能不佳。例如,你有:
NSUInteger imageBytesPerRow = bytesPerPixel * imageWidth;
如果imageBytesPerRow不是CPU本机字长的倍数,那么您将获得次优性能。
答案 1 :(得分:0)
我认为“设备灰色”颜色空间因设备而异。尝试使用独立于设备的色彩空间。