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