0

2 つの画像を比較しようとしています (実際には、大きな画像内の小さな「サブ画像」を見つけます)。以下に示す方法を使用して画像を読み込んでいます。

以下のコードには、個々のバイト値をすべて合計するテスト用 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);
4

2 に答える 2

2

デバイスはすべて同じバージョンの OS を実行していますか? 別の可能性 (既に誰かが言及した色空間以外) は、JPG デコード ライブラリが微妙に異なる可能性があることです。JPEG は非可逆画像形式であるため、異なるデコーダーがビットが等しくない結果のビットマップを生成することは考えられません。iOS UI で画像が頻繁に使用されていることを考えると、JPG デコーダーは、最大のパフォーマンスを得るために常に調整されているものであると考えるのが妥当であるように思われます。

異なるモデルのデバイス (つまり、異なるプロセッサ) で実行されている同じ OS バージョン間で、特定の CPU 用にそれぞれが大幅に最適化された複数のバージョンの JPG デコーダーが存在する場合、結果はビットが等しくない可能性があるとさえ考えられます。 、ただし、同じ OS を搭載した同じモデルの 2 つのデバイスの違いは説明できません。

ロスレス形式の画像を使用して実験を再実行してみてください。

また、CGBitmapContext に独自のバッキング メモリを提供しても、単語の配置を特別に考慮しないと、パフォーマンスが低下する可能性があることも指摘しておく価値があります。たとえば、次のものがあります。

NSUInteger imageBytesPerRow = bytesPerPixel * imageWidth;

imageBytesPerRow が CPU のネイティブ ワード長の倍数でない場合、最適なパフォーマンスが得られません。

于 2012-12-05T15:57:45.630 に答える
0

「デバイスグレー」の色空間はデバイスによって異なると思います。デバイスに依存しない色空間で試してください。

于 2012-12-05T14:07:58.030 に答える