CGBitmapContextCreate: неподдерживаемая комбинация параметров
Я пытаюсь создать 8-битный контекст в градациях серого следующим образом:
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
CGContextRef context = CGBitmapContextCreate(
data, m_width, m_height, 8, m_width, colorSpace,
kCGBitmapByteOrder32Little|kCGImageAlphaNone);
Но у меня есть следующая ошибка:
CGBitmapContextCreate: unsupported parameter combination:
8 integer bits/component; 8 bits/pixel; 1-component color space;
kCGImageAlphaNone; 1936 bytes/row.
Почему эта комбинация не поддерживается?
2 ответа
Поддерживаемые комбинации битов на компонент, битов на пиксель и цветового пространства можно найти в " Руководстве по программированию в Quartz 2D "
Как писал Николай, использование kCGBitmapByteOrder32Little с kCGImageAlphaNone не имеет смысла для серого цветового пространства (и не поддерживается).
Теперь, в зависимости от ваших байтов на строку и высоту, вам необходимо выделить достаточно памяти для CGBitmapContextCreate
у вас данные параметра. Вы не показывали код, в котором вы устанавливали высоту и выделяли память для данных, но я думаю, что ваша проблема в этом.
Кроме того, вам на самом деле не нужно выделять память самостоятельно (начиная с iOS 4.0), в соответствии с документацией CGBitmapContextCreate, вы можете передать NULL в качестве данных, чтобы выделить память для вас. Вы все еще можете получить доступ к указателю данных позже, запросив его с помощью CGBitmapContextGetData
,
Еще одно замечание, что прохождение m_width
как bytesPerRow
является правильным только в этом случае (серое цветовое пространство с 1 байтом на пиксель), но, вероятно, не является хорошей практикой. Если вы передаете NULL для данных, вы также можете передать 0 здесь, чтобы рассчитать их автоматически.
Это, вероятно, kCGBitmapByteOrder32Little
(что не имеет никакого смысла для одноканальных изображений серой шкалы в любом случае).
Вы можете просто удалить это из спецификации формата пикселей.