我想通过UIView创建遮罩效果以完成以下操作。我将在屏幕上显示一个密封的盒子,用户将能够触摸(划伤)屏幕以揭示该图像背后的内容(UIView)。一些类似于那些彩票的地方,我们假设你会在结果上划出一些覆盖材料。在视图上创建遮罩效果
如果有人能指向我的方向是正确的,我不知道如何开始这样做。 ..
感谢
我想通过UIView创建遮罩效果以完成以下操作。我将在屏幕上显示一个密封的盒子,用户将能够触摸(划伤)屏幕以揭示该图像背后的内容(UIView)。一些类似于那些彩票的地方,我们假设你会在结果上划出一些覆盖材料。在视图上创建遮罩效果
如果有人能指向我的方向是正确的,我不知道如何开始这样做。 ..
感谢
像素编辑通常用CGBitmapContext完成。在这种情况下,我认为您会希望创建一个灰度位图,该位图仅表示刮擦区域的Alpha通道。当用户划痕时,您将在此位图中绘制。
要使用GCBitmapContext作为图像的遮罩,必须首先从位图创建遮罩图像。使用CGImageMaskCreate并传入指向用于创建位图的相同像素的数据提供程序。然后使用CGImageCreateWithMask和您的刮除图像以及作为位图的蒙版图像。
你不能直接在iPhone上画图。每次用户移动手指时,都必须修改遮罩位图,然后使绘制图像的UIView无效。您可能会再次绘制相同的图像,或者您可能需要在每次绘制时重建蒙版和蒙版图像。只要掩模图像直接指向位图像素数据,实际分配的内存很少。
所以在伪代码,你想是这样的:
scratchableImage = ...
width = CGImageGetWidth(scratchableImage);
height = CGImageGetHeight(scratchableImage);
colorspace = CGColorSpaceCreateDeviceGray();
pixels = CFDataCreateMutable(NULL , width * height);
bitmap = CFBitmapContextCreate(CFDataGetMutableBytePtr(pixels) , width , height , 8 , width , colorspace , kCGImageAlphaNone);
provider = CGDataProviderCreateWithCFData(pixels);
mask = CGImageMaskCreate(width , height , 8 , 8 , width , provider , NULL , false , kCGRenderingIntentDefault);
scratched = CGImageCreateWithImageInRect(scratchableImage , mask);
在这一点上,scratched
将有一个alpha通道由bitmap
决定,但bitmap
有垃圾数据。位图中的白色pixels
不透明,黑色像素清晰。在bitmap
中绘制所有白色像素,然后在用户划痕时绘制黑色像素。我认为bitmap
的更改会在每次绘制scratched
时自动应用,但如果没有,那么每次绘制时只需重新创建mask
和scratched
。
您可能有一个用于跟踪用户输入的自定义UIView。你可以从你的UIImageView派生自定义视图,让它绘制图像或执行以下操作:
-(void) drawRect:(CGRect)inDirty {
// assume scratched is a member
CGContextDrawImage(UIGraphicsGetCurrentContext() , [self bounds] , scratched);
}
或者你可以跳过创建scratched
,而使用CGContextClipToMask
和直接绘制原scratchableImage
。如果没有scratchableImage
并且您的划痕区域是纹理或视图层次结构,请采用此方法。
对不起,我迟到了。我做了一些可能有所帮助的示例代码:https://github.com/oyiptong/CGScratch
drawnonward的方法起作用。