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 (что не имеет никакого смысла для одноканальных изображений серой шкалы в любом случае).

Вы можете просто удалить это из спецификации формата пикселей.

Другие вопросы по тегам