Colourise CGContextRef, но сохранить альфа - PullRequest
2 голосов
/ 04 ноября 2011

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

Редактировать: Пример кода (ширина и высота - это предопределенные числа с плавающей точкой, точки - это массив 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

1 Ответ

2 голосов
/ 11 ноября 2011

Проблема была в том, что мне нужна была 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);

для его исправления.

...