0

vImageHistogramCalculation現在のアプリケーションで画像のヒストグラムを計算するために使用しましたが、場合によっては EXC_BAD_ACCESS を取得しています。次のようなケースを経験しました-

- (void)histogramForImage:(UIImage *)image {
    vImage_Buffer inBuffer;
    CGImageRef img = image.CGImage;

    CGDataProviderRef inProvider = CGImageGetDataProvider(img);
    CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);

    inBuffer.width = CGImageGetWidth(img);
    inBuffer.height = CGImageGetHeight(img);
    inBuffer.rowBytes = CGImageGetBytesPerRow(img);

    inBuffer.data = (void*)CFDataGetBytePtr(inBitmapData);

    vImagePixelCount histogram[4][8] = {{0}};
    vImagePixelCount *histogramPointers[4] = { &histogram[0][0], &histogram[1][0], &histogram[2][0], &histogram[3][0] };
    vImage_Error error = vImageHistogramCalculation_ARGBFFFF(&inBuffer, histogramPointers, 8, 0, 255, kvImageNoFlags);

    if (error) {
        NSLog(@"error %ld", error);
    }

    CGDataProviderRelease(inProvider);
}
  1. iPhoneカメラロールの画像をPNG形式で使用し、上記のコードで手動でバンドルに入れたところ、正常に動作しました。

  2. iPhone Camera Roll のJPG形式の画像に同じコードを使用すると、EXC_BAD_ACCESS エラーが発生します。

  3. Photos Frameworkを使用して Camera Roll から画像を取得しようとした後、同じコードに渡したところ、EXC_BAD_ACCESS エラーが発生しました。

実際に必要なのは、iPhone Camera Rollのすべての画像のヒストグラムを見つけることです。そのため、上記のコードがある画像形式では正常に機能し、他の画像形式では失敗する理由を見つけることができません。クラッシュの他の理由はありますか?

EDIT 1-画像形式についてではなく、一部のJPG画像でも正常に機能するようになりましたが、場合によってはクラッシュすることもあります.どうすればそれを理解できますか?

参考

https://developer.apple.com/library/mac/documentation/Performance/Reference/vImage_histogram/#//apple_ref/c/func/vImageHistogramCalculation_ARGBFFFF

vImageHistogramCalculation を使用して画像のヒストグラムを計算する

4

1 に答える 1

1

vImageHistogramCalculation_ARGBFFFF は、4 チャネルの浮動小数点データ用です。データ プロバイダーから取得するデータが RGB または RGBA 8 ビット整数データである可能性は非常に高くなります。画像データの格納形式はCGImageRefで確認してください。

CGImageRef から特定のデータ形式が必要な場合は、vImageBuffer_InitWithCGImage() を呼び出すことができます。

于 2015-10-16T22:33:53.073 に答える