Подсветка артефактов при использовании режима Hard Light Blend - PullRequest
4 голосов
/ 28 июня 2011

Я смешиваю два изображения в своем приложении для iPhone, используя режим наложения HardLight верхнего изображения.Это выглядит примерно так:

UIGraphicsBeginImageContext(size);
[sourceImage drawInRect:rectangle blendMode:kCGBlendModeNormal alpha:1.0];
[effectOverlay drawInRect:rectangle blendMode:kCGBlendModeHardLight alpha:0.75];
mainImage.image =  UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Работает нормально.Однако выцветшие блики на изображении появляются со странным цветовым артефактом.Обратите внимание на фиолетовый артефакт в правом нижнем углу этой фотографии:

http://dl.dropbox.com/u/626891/artifact.jpg http://dl.dropbox.com/u/626891/artifact.jpg

Это происходит только при использовании Hard Light;другие режимы смешивания в порядке.Кто-нибудь знает, что с этим делать?

Ответы [ 5 ]

2 голосов
/ 05 марта 2012

Эта проблема довольно раздражает. Кто-нибудь подал отчет об ошибке в Apple?

Тем не менее, вот еще один обходной путь, который, кажется, лучше подходит для решения проблемы более надежно, чем подходы adhoc, которые я вижу здесь (которые не работали для меня). Полезно знать, что режим наложения HardLight такой же, как Overlay, только с двумя переключенными аргументами. И дело в том, что реализация Overlay для iOS не глючит. Поэтому вам нужно передвигаться по рисунку (и, возможно, сделать промежуточный снимок с UIGraphicsGetImageFromCurrentImageContext или подобным), чтобы вы нарисовали два изображения в переключенном порядке. Таким образом, вы можете использовать Overlay вместо HardLight.

Итак, для вашего примера измените код на:

    UIGraphicsBeginImageContext(size);
    [effectOverlay drawInRect:rectangle blendMode:kCGBlendModeNormal alpha:0.75];
    [sourceImage drawInRect:rectangle blendMode:kCGBlendModeOverlay alpha:1.0];
    mainImage.image =  UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

Надеюсь, это поможет.

2 голосов
/ 16 февраля 2012

Я получаю похожие артефакты с помощью kCGBlendModeColor. Я не думаю, что это проблема с цветовым пространством. Похоже, что iOS не зажимает на 255 при вычислении значения пикселя. Определенно ошибка в ОС. Грустно, потому что это похоже на обработку изображений 101.

1 голос
/ 16 февраля 2012

Нашли решение / обходной путь ...

Просто просмотрите изображение и измените любой пиксель с 255 255 255 на 254 254 254, и вы не увидите артефакты.

Просто работал на меня.

Для ясности, в моем случае у меня есть контекст, в котором есть изображение, которое нужно тонировать, и CGImage, который содержит цвет, который я хочу подкрасить, используя CGDrawImage с kCGBlendModeColor. Я просто делаю временное изображение из контекста, прохожу каждый пиксель в поисках 255, 255, 255 и изменяю эти пиксели на 254, 254, 254. Затем я помещаю это изображение обратно в контекст и рисую оттенок с помощью kCGBlendModeColor это все хорошо.

Надеюсь, это поможет.

1 голос
/ 04 сентября 2011

Мне удалось подтвердить, что это, скорее всего, проблема с цветовым пространством.Я использую приложение под названием Opacity для визуального создания фигур, эффектов наложения, теней и т. Д. И экспортирую результаты в код Core Graphics.Мне довелось использовать режим смешивания Hard Light, но в Opacity все выглядело просто замечательно.Однако, когда я экспортировал и запустил код на iOS, у меня были те же артефакты.

Это не совсем решение, но в моем случае я просто маскировал и заливал сплошным цветом, смешиваяс изображением над ним (Hard Light). Я заметил, что эти артефакты возникали только с цветами заливки, яркость которых составляла 100% .Установка яркости до 99% решила мою конкретную проблему.Однако для смешивания изображений и прочего я думаю, что вам придется поиграться с цветовыми пространствами.

Хотя я могу ошибаться.Я, конечно, не эксперт по цвету.

0 голосов
/ 07 августа 2013

У меня была такая же проблема с kCGBlendModeNormal. У меня был метод, который накладывал два изображения с определенным альфа и определенным режимом наложения:

- (UIImage *)overlayImage:(UIImage *)image withBlendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha 
{
CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
UIGraphicsBeginImageContext(self.size);
CGContextSetInterpolationQuality(UIGraphicsGetCurrentContext(), kCGInterpolationHigh);
[self drawInRect:rect blendMode:kCGBlendModeNormal alpha:0.99];
[image drawInRect:rect blendMode:blendMode alpha:alpha * 0.99];
UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return result; 
}

Использование максимального значения 0,99 для альфы гарантирует, что у меня не будет пикселей с 255, 255, 255. Надеюсь, это поможет

...