Я пытаюсь получить доступ указателя непосредственно к базовому буферу 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 байт буфера, но чувствует себя некрасиво.
Исправить меня, если я неправильно понял, вы хотите превратить свое изображение в растровое изображение? – aout