Раскрасить CGContextСсылка, но сохранить альфа

У меня есть CGContextRef, и я могу рисовать на нем и указывать альфа-канал, и если я попытаюсь его использовать, он будет работать отлично. Тем не менее, я пытаюсь раскрасить его (в настоящее время красный или зеленый), но какой бы режим наложения я ни выбрал, альфа установлена ​​на 1 (потому что я рисую с альфой как 1). Нарисовать правильный цвет на самом деле нереально, так как я хотел бы иметь возможность раскрашивать UIImage, загруженные из файловой системы, так как мне этого добиться?

Изменить: пример кода (ширина и высота - это предопределенные числа с плавающей запятой, точки - это массив CGPoints, все из которых лежат внутри контекста, а цвет - это UIColor с непрозрачностью 100%) -

UIGraphicsBeginImageContext(CGSizeMake(width,height));

CGContextRef contextRef = UIGraphicsGetCurrentContext();
CGContextClearRect(contextRef, CGRectMake(0.0f, 0.0f, width, height));
CGContextSetRGBStrokeColor(contextRef, 0.0f, 0.0f, 0.0f, 1.0f);
CGContextSetRGBFillColor(contextRef, 1.0f, 1.0f, 1.0f, 1.0f);
CGContextSetLineWidth(contextRef, lineWidth);

CGContextBeginPath(contextRef);
CGContextMoveToPoint(contextRef, points[0].x, points[0].y);
for (int i = 1; i < 4; i++) {
    CGContextAddLineToPoint(contextRef, points[i].x, points[i].y);
}
CGContextAddLineToPoint(contextRef, points[0].x, points[0].y); // Encloses shape

CGContextDrawPath(contextRef, kCGPathFillStroke);

[color setFill];

CGContextBeginPath(contextRef);
CGContextSetBlendMode(contextRef, kCGBlendModeMultiply);
CGContextAddRect(contextRef, CGRectMake(0.0f, 0.0f, width, height));
CGContextDrawPath(contextRef, kCGPathFill);

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Заранее благодарим вас за помощь,
jrtc27


person jrtc27    schedule 03.11.2011    source источник
comment
Не могли бы вы дать нам пример кода, чтобы мы могли лучше рассмотреть вашу проблему?   -  person Totumus Maximus    schedule 07.11.2011
comment
Хорошо, это помогает. Я пытаюсь понять, как вы думаете, поэтому, пожалуйста, скажите мне, прав ли я. Из того, что я вижу, вы пытаетесь нарисовать белый прямоугольник с черной рамкой без прозрачности. Затем вы выполняете неизвестную функцию [color setFill]; который я не знаю, что он делает (хотя названия говорят сами за себя, вы, возможно, тоже захотите предоставить нам эту информацию). Затем вы рисуете другой путь с таким же размером поверх предыдущего прямоугольника. Затем вы хотите взять рисунок и сохранить его в этом изображении var.   -  person Totumus Maximus    schedule 10.11.2011
comment
Теперь небольшое уточнение: kCGBlendModeMultiply умножает образцы исходного изображения на образцы фонового изображения. В результате получаются цвета, которые по крайней мере такие же темные, как любой из двух участвующих образцов цветов. Так что вы все равно можете захотеть использовать другой. Попробуйте установить его в нормальное состояние и опубликуйте результаты. Также: если у вас есть проблемы с альфа-версией, попробуйте вручную настроить контекст с помощью функции: CGContextSetAlpha (CGContextRef c, CGFloat alpha); Попробуйте и опубликуйте результаты здесь.   -  person Totumus Maximus    schedule 10.11.2011
comment
Я хочу, чтобы у белого квадрата с черной рамкой была альфа 1, а у фона была альфа 0 - я этого добиваюсь. Однако я пытаюсь взять это изображение и применить цвет, не меняя альфа контекста. Стоит ли мне попробовать ваше предложение? BTW [color setFill] делает UIColor цветом заливки для текущего контекста.   -  person jrtc27    schedule 10.11.2011
comment
я не очень хорошо вас понимаю, но может быть полезно CGContextStrokePath (context); CGContextFillPath (контекст); и один этот developers-life.com/color-picker-for-ios .html - пример получения цвета из изображения.   -  person Volodymyr B.    schedule 10.11.2011


Ответы (1)


Проблема была в том, что мне нужен CGContextClipToMask. Это означало, что моему коду требовалось следующее:

CGContextTranslateCTM(contextRef, 0, height);
CGContextScaleCTM(contextRef, 1.0, -1.0);

чтобы преобразовать координаты, а затем

CGRect rect = CGRectMake(0.0f, 0.0f, width, height);
CGContextClipToMask(contextRef, rect, UIGraphicsGetImageFromCurrentImageContext().CGImage);

починить это.

person jrtc27    schedule 11.11.2011