CGContextDrawImage跨设备的字节值不一致?

时间:2012-12-05 13:23:56

标签: iphone objective-c ios bitmap core-graphics

我正在尝试比较两个图像(实际上在较大的图像中找到一个较小的“子图像”),我正在使用下面提供的方法加载图像。

下面的代码现在包含一个测试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);

2 个答案:

答案 0 :(得分:2)

设备是否都运行相同版本的操作系统?另一种可能性(超出颜色空间,有人已经提到)是JPG解码库可能略有不同。由于JPEG是有损图像格式,因此不同的解码器会产生不相等的结果位图并不是不可想象的。考虑到在iOS UI中大量使用图像,假设JPG解码器正在经历不断的调整以获得最大性能,这似乎是合理的。

我甚至认为可以想象,在不同型号的设备(即不同的处理器)上运行的相同操作系统版本之间,如果有多个版本的JPG解码器,每个都经过大量优化,结果可能不相等。一个特定的CPU,虽然这不能解释相同型号的两个设备之间的区别,但是具有相同的操作系统。

您可能会尝试使用无损格式的图像重新运行实验。

值得指出的是,为CGBitmapContext提供自己的后备内存,但不对字对齐进行特殊限制可能会导致性能不佳。例如,你有:

NSUInteger imageBytesPerRow = bytesPerPixel * imageWidth;

如果imageBytesPerRow不是CPU本机字长的倍数,那么您将获得次优性能。

答案 1 :(得分:0)

我认为“设备灰色”颜色空间因设备而异。尝试使用独立于设备的色彩空间。