Умножение RGBA с двумя CGImageRefs - PullRequest
       46

Умножение RGBA с двумя CGImageRefs

3 голосов
/ 16 сентября 2010

Я бы хотел умножить r, g, b и значения двух CGImages, чтобы использовать одно изображение как маску (в своем альфа-канале) и оттенок (в каналах rgb). Я сначала попробовал просто:

CGContextDrawImage(context, CGRectMake(0, 0, _w, _h), handle());
CGContextSetBlendMode(context, kCGBlendModeMultiply);
CGContextDrawImage(context, CGRectMake(0, 0, other->width(), other->height()), over);

Тем не менее, это только оттенки, и не маскирует. Таким образом, я извлек альфа из маскирующего изображения в изображение в градациях серого с маской CGImage (используя CGDataProvider) и использовал его в качестве маски в контексте:

// "mask" is "other"'s alpha channel as an inverted grayscale image
CGContextSaveGState(context);
CGContextClipToMask(context, CGRectMake(0, 0, other->width(), other->height()), mask);
CGImageRelease(mask);
CGContextDrawImage(context, CGRectMake(0, 0, _w, _h), handle());
CGContextRestoreGState(context); // Don't apply the clip mask to 'other', since it already has it
CGContextSetBlendMode(context, kCGBlendModeMultiply);
CGContextDrawImage(context, CGRectMake(0, 0, other->width(), other->height()), other->handle());

Это все равно будет выглядеть неправильно. Изображение становится светлее ; должно ли умноженное изображение быть хотя бы темнее? Превью изображений на:

http://dl.dropbox.com/u/6775/multiply/index.html

Заранее спасибо за просветление:)

1 Ответ

2 голосов
/ 16 сентября 2010

Во-первых, вам не нужно извлекать альфа-канал в отдельный канал для маскировки. Вы можете просто нарисовать его с помощью kCGBlendModeDestinationIn. Для перевернутой маски тоже самое, но с kCGBlendModeDestinationOut.

Итак, решение состоит в том, чтобы нарисовать второе изображение с помощью Multiply, а затем нарисовать его снова с Destination In или Out.

...