我想在iOS中的兩張圖片之間做一個選擇性的遮罩,類似於Blender中的遮罩功能。有兩個圖像1和2(調整大小相同的尺寸)。最初只有圖像1可見,但無論用戶觸摸image1上的任何區域,它都變得透明,圖像2在這些區域中變得可見。掩蔽兩張圖片
我用觸摸移動使用核心圖形創建了一個面具般的圖像。它基本上是一個全黑的圖像,無論我在哪裏觸摸,都會有白色部分。整個alpha設置爲1.0。我可以使用這個圖像作爲蒙版,並通過實現我自己的圖像處理方法來完成必要的操作,這些方法將遍歷每個像素,檢查並根據值進行設置。現在這種方法將被稱爲內部觸摸移動,所以我的方法可能會減慢整個過程(特別是對於800萬像素的相機圖像)。
我想知道如何通過使用Quartz Core或Core Graphics來實現這個功能,這樣可以高效運行大圖片。
代碼我迄今爲止:
- (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但我無法理解答案。
雅您的實現是實時的速度不夠快,但你能不能給我任何想法,關於拯救的道路,我的意思是想我從中間開始並沿對角線頂端,然後我想通過整個路徑看到蘋果標誌圖像,而不是觸摸點周圍的特定圓圈。 – 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; ' 要檢查性能,您必須在真實設備上運行此功能。請記住,模擬器上的CPU操作運行速度更快,而模擬器上GPU運行速度非常慢,因爲模擬器必須創建基於GPU的軟件代碼,所以GPU操作在真實設備上運行得更快。 – nsuinteger