2015-04-30 3 views
4

Я пытаюсь получить доступ указателя непосредственно к базовому буферу RGB CGImageRef. Моя первая попытка выглядит следующим образом:Получение необработанного буфера RGB из CGImageRef

CGImageRef image = [...]; 
CFDataRef rawData = CGDataProviderCopyData(CGImageGetDataProvider(image)); 
const UInt8 * buf = CFDataGetBytePtr(rawData); 
int length = CFDataGetLength(rawData); 

Однако если сравнить длину length с произведением ширины и высоты, вот что я получаю:

size_t w = CGImageGetWidth(image); 
size_t h = CGImageGetHeight(image); 
CGColorSpaceRef color_space = CGImageGetColorSpace(image); 
size_t nsamples = CGColorSpaceGetNumberOfComponents (color_space); 
assert(length == w * h * 4 && nsamples == 3); 

Я понимаю под some circumstances (в основном в демонстрационных целях), проще манипулировать буфером RGBA (или ARGB), но в моем конкретном случае мне просто нужно развернуть изображение JPEG/PNG/TIFF RGB (= 3). Вышеприведенный код прекрасно работает для извлечения буфера RGBA (4 значения), но на самом деле я ищу еще один API для доступа к этому необработанному RGB (3 пиксельных значения) буфера. В этом случае я бы:

assert(length == w * h * 3 && nsamples == 3); // only RGB 

Когда все остальное не могу просто скопировать 3 RGB байт из 4 RGBA байт буфера, но чувствует себя некрасиво.

+1

Исправить меня, если я неправильно понял, вы хотите превратить свое изображение в растровое изображение? – aout

ответ

2

Каркас, который вы используете, не поддерживает данные изображения 24bpp. Это подразумевает ссылку «некоторые обстоятельства» в вашем вопросе.

(Вы можете увидеть эту таблицу в документации Apple по адресу https://developer.apple.com/library/ios/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_context/dq_context.html#//apple_ref/doc/uid/TP30001066-CH203-CJBEAGHH).

Вам нужно будет извлечь нужные байты из своего rawData и скопировать их в отдельный буфер. (Или измените алгоритм обработки изображений, что бы то ни было, чтобы обрабатывать 32bpp.)

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