Я хочу сделать выборочную маскировку между двумя изображениями в iOS, подобную функции маски в Blender. Есть два изображения 1 и 2 (с размерами до одинаковых размеров). Первоначально только изображение 1 будет видимым, но где бы пользователь ни коснулся какой-либо области изображения1, он становится прозрачным, а изображение 2 становится видимым в этих регионах.Маскирование двух изображений
Я создал маску-изображение, используя основную графику с движением касания. Это, по сути, полное черное изображение с белыми участками, где я касался. Альфа устанавливается равной 1.0. Я могу использовать это изображение в качестве маски и делать все необходимое, внедряя свои собственные методы обработки изображений, которые будут перебирать каждый пиксель, проверять его и устанавливать соответствующие значения. Теперь этот метод будет называться внутри touch touch, поэтому мой метод может замедлить весь процесс (особенно для 8-мегапиксельных изображений).
Я хочу знать, как это может быть достигнуто с использованием кварцевого ядра или основной графики, которая будет достаточно эффективной для работы в больших изображениях.
код у меня до сих пор:
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
mouseSwiped = YES;
UITouch *touch = [touches anyObject];
CGPoint currentPoint = [touch locationInView:staticBG];
UIGraphicsBeginImageContext(staticBG.frame.size);
[maskView.image drawInRect:CGRectMake(0, 0, maskView.frame.size.width, maskView.frame.size.height)];
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 20.0);
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 1.0, 1.0, 1.0, 0.0);
CGContextBeginPath(UIGraphicsGetCurrentContext());
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
CGContextStrokePath(UIGraphicsGetCurrentContext());
maskView.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
lastPoint = currentPoint;
mouseMoved++;
if (mouseMoved == 10)
mouseMoved = 0;
staticBG.image = [self maskImage:staticBG.image withMask:maskView.image];
//maskView.hidden = NO;
}
- (UIImage*) maskImage:(UIImage *)baseImage withMask:(UIImage *)maskImage
{
CGImageRef imgRef = [baseImage CGImage];
CGImageRef maskRef = [maskImage CGImage];
CGImageRef actualMask = CGImageMaskCreate(CGImageGetWidth(maskRef),
CGImageGetHeight(maskRef),
CGImageGetBitsPerComponent(maskRef),
CGImageGetBitsPerPixel(maskRef),
CGImageGetBytesPerRow(maskRef),
CGImageGetDataProvider(maskRef), NULL, false);
CGImageRef masked = CGImageCreateWithMask(imgRef, actualMask);
return [UIImage imageWithCGImage:masked];
}
Метод maskImage не работает, так как создает изображение маски в зависимости от значения альфа. Я прошел по этой ссылке: Creating Mask from Path, но я не могу понять ответ.
Ya вашей реализация достаточно быстро в режиме реального времени, но вы можете дать мне какие-либо идеи о сохранении пути, я имею в виду предположит, я начну с середины и идите по диагонали сверху, тогда я хочу увидеть изображение логотипа яблока по всему пути, а не конкретный круг вокруг точки касания. – Soumyajit
Я сделал свой запрос гораздо более понятным здесь: http://stackoverflow.com/questions/19218422/rgbstroke-image-pixels-instead-of-color-ios Пожалуйста, смотрите. – Soumyajit
Когда у вас есть изображение с вашего CGPath, установите свойство содержимого слоя маски, как я сделал в примере. 'masklayer.contents = (__bridge id) (imagefromCGPath.CGImage); bottomimage.layer.mask = masklayer; ' Чтобы проверить производительность, вы должны запустить это на реальном устройстве. Имейте в виду, что операции ЦП выполняются быстрее на симуляторе, в то время как операции графического процессора работают очень медленно на симуляторе, так как симулятор должен создавать программный код графического процессора, поэтому операции графического процессора выполняются намного быстрее на реальном устройстве. – nsuinteger