Как создать растровый контекст для изображения альфа-маски? - PullRequest
2 голосов
/ 19 июня 2011

Я хочу нарисовать изображение альфа-маски в коде.Сейчас я делаю:

1) Создайте растровый контекст, используя CGBitmapContextCreate с параметрами CGColorSpaceCreateDeviceRGB и kCGImageAlphaPremultipliedFirst.

2) Затем я рисую в этом контексте, используя только оттенки серого.как белый и черный.

3) Затем я создаю изображение маски из этого контекста, используя CGImageMaskCreate.

Вывод: я трачу много памяти!Потому что, насколько я понимаю, изображение маски только в оттенках серого, верно?Так зачем создавать контекст в ARGB.

Как я могу создать CGContextRef, который предназначен для рисования маскирующего изображения?Я думаю использовать CGColorSpaceCreateDeviceGray, но здесь начинаются проблемы.Вот точный код, как я создаю свой растровый контекст ARGB:

CGContextRef    context = NULL;
CGColorSpaceRef colorSpace;
uint32_t *      bitmapData;

int imageWidth = round(size.width);
int imageHeight = round(size.height);

int bitmapBytesPerRow = (imageWidth * 4);
int bitmapByteCount = (bitmapBytesPerRow * imageHeight);

colorSpace = CGColorSpaceCreateDeviceRGB();

bitmapData = malloc(bitmapByteCount);

context = CGBitmapContextCreate(bitmapData,
                                imageWidth,
                                imageHeight,
                                8,  // bits per component
                                bitmapBytesPerRow,
                                colorSpace,
                                kCGImageAlphaPremultipliedFirst);

CGColorSpaceRelease(colorSpace);

Я не уверен, как вычислить bitmapBytesPerRow для такого контекста.Я предполагаю, что это будет просто imageWidth?И что я должен предоставить для bits per component в CGBitmapContextCreate?

Существует CGColorSpaceGetNumberOfComponents(), но он сообщает только количество компонентов.Это не говорит мне, сколько байтов имеет компонент.

Также меня нервирует то, что 4 и 8 жестко закодированы в моем коде выше.Кто сказал, что это всегда 4 байта на компонент, а кто сказал, что это 8 бит на компонент?Я просто взял это из различных примеров кодов там.Кажется, все так делают.Оно работает.Но будущее доказательство?Наверное, нет.

Вы бы сделали мой день с некоторыми отличными ответами.Спасибо.


Редактировать: Я нашел фрагмент кода, но это сбивает с толку:

CGColorSpaceRef colorSpace2 = CGColorSpaceCreateDeviceGray();
CGContextRef gradientBitmapContext = CGBitmapContextCreate (NULL, 1, reflectRect.size.height,8, 0, colorSpace2, kCGImageAlphaNone);

Почему 0 для байтов в строке?В документации не сказано, что вы можете пройти 0. Выглядит неправильно.

1 Ответ

1 голос
/ 19 июня 2011

Эти параметры говорят системе, как обрабатывать данные или память, которые вы предоставляете. Вы создали это сами, так что вы знаете, какой макет вы собираетесь. Что, если вообще что-то может делать с системой за кулисами, не является вашей непосредственной проблемой.

В этом случае вы предоставите 8 бит на семпл, только с 1 компонентом, и, вероятно, не захотите использовать какие-либо дополнения строк, в этом случае ваш bytesPerRow действительно должен быть таким же, как ширина изображения. 1004 *

...