Проблема при вычислении гистограммы изображения с использованием vImageHistogramCalculation

Я использовал 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 Camera Roll в формате PNG и вручную поместил его в пакет в приведенном выше коде, и он отлично работает.

  2. Я использовал тот же код для изображения с iPhone Camera Roll в формате JPG, тогда я получаю ошибку EXC_BAD_ACCESS.

  3. Я попытался получить изображение из Camera Roll с помощью Photos Framework, а затем перешел на тот же код, а затем я получаю ошибку EXC_BAD_ACCESS.

Что мне действительно нужно, так это найти гистограмму всех изображений iPhone Camera Roll. Поэтому я не могу выяснить, почему вышеуказанный код работает нормально для одного формата изображения и не работает для другого. Есть ли какая-либо другая причина сбоя?

РЕДАКТИРОВАТЬ 1- я пришел к тому, что он не относится к формату изображения, он работает нормально для некоторых изображений JPG, но в некоторых случаях он все еще падает. Как мне это выяснить?

Ссылка:

https://developer.apple.com/library/mac/documentation/Performance/Reference/vImage_histogram/

Вычислить гистограмму изображения с помощью vImageHistogramCalculation

1 ответ

vImageHistogramCalculation_ARGBFFFF для четырехканальных данных с плавающей запятой. Очень высока вероятность того, что данные, которые вы получаете от поставщика данных, представляют собой 8-разрядные целочисленные данные RGB или RGBA. Проверьте с помощью CGImageRef формат хранения данных изображения.

Если вам нужен определенный формат данных из CGImageRef, вы можете вызвать vImageBuffer_InitWithCGImage().

Другие вопросы по тегам