Проблема при вычислении гистограммы изображения с использованием 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);
}
Я использовал изображение с iPhone Camera Roll в формате PNG и вручную поместил его в пакет в приведенном выше коде, и он отлично работает.
Я использовал тот же код для изображения с iPhone Camera Roll в формате JPG, тогда я получаю ошибку EXC_BAD_ACCESS.
Я попытался получить изображение из 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().