2016-12-19 3 views
0

Я написал этот код, который должен быть NSLog для всех небелых пикселей в качестве теста, прежде чем идти дальше.Чтение пикселей из результатов UIImage в BAD_ACCESS

Это мой код:

UIImage *image = [UIImage imageNamed:@"image"]; 
CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage)); 
if(!pixelData) { 
    return; 
} 

const UInt8 *buffer = CFDataGetBytePtr(pixelData); 
CFRelease(pixelData); 

for(int y = 0; y < image.size.height; y++) { 
    for(int x = 0; x < image.size.width; x++) { 
     int pixelInfo = ((image.size.width * y) + x) * 4; 

     UInt8 red = buffer[pixelInfo]; 
     UInt8 green = buffer[(pixelInfo + 1)]; 
     UInt8 blue = buffer[pixelInfo + 2]; 
     UInt8 alpha = buffer[pixelInfo + 3]; 

     if(red != 0xff && green != 0xff && blue != 0xff){ 
      NSLog(@"R: %hhu, G: %hhu, B: %hhu, A: %hhu", red, green, blue, alpha); 
     } 
    } 
} 

По какой-то причине, когда я построить приложение, он перебирает на мгновение, а затем бросает BAD_ACCESS ошибку на линии: UInt8 red = buffer[pixelInfo];. В чем может быть проблема?

Является ли это самым быстрым методом для итерации через пиксели?

+0

Я запустил приведенный выше фрагмент, и это не дало мне никакой ошибки, используя изображение размером 75 × 35 пикселей. Я добавил, что код в View был загружен. –

+0

Мое изображение намного больше, но это не должно быть проблемой :( – Fengson

ответ

0

Я думаю, проблема в ошибке размера буфера. буфер имеет размер ширины x высота и pixelInfo имеет 4 множителя. Я думаю, вам нужно создать массив в 4 раза больше и сохранить каждый пиксельный цвет буфера в этом новом массиве. Но вы должны быть осторожны, чтобы не больше читать размер буфера.

+0

Буфер имеет размер, взятый из CFDataGetBytePtr, который является правильным количеством байтов. – Fengson

Смежные вопросы