iphone橡皮擦功能的实现

如何正确的实现橡皮擦功能  

很多朋友遇到过这个问题,如何实现橡皮擦功能呢?
简单的解决方法是取背景色然后绘制,这个是不对的。应该说是很迫不得已的选择!
我们希望清除图片数据再具体像素上的数据或者都赋值为0.

CGContextSetBlendMode 函数会影响绘制时候的混色算法

例如点击橡皮擦后设置

CGContextSetBlendMode(context, kCGBlendModeClear);

这样再绘制时就会清除图像数据。

其它模式还包括

kCGBlendModeNormal    
kCGBlendModeMultiply    
kCGBlendModeScreen    
kCGBlendModeOverlay    
kCGBlendModeDarken    
kCGBlendModeLighten    
kCGBlendModeColorDodge    
kCGBlendModeColorBurn    
kCGBlendModeSoftLight    
kCGBlendModeHardLight    
kCGBlendModeDifference    
kCGBlendModeExclusion    
kCGBlendModeHue    
kCGBlendModeSaturation    
kCGBlendModeColor    
kCGBlendModeLuminosity    



但是还需要继续深入。我们的绘制操作应该是对一个CGContextRef进行,这个东西(看Ref就知道实际上是个指针)的创建过程还会影响到我们的橡皮擦效果。
使用CGBitmapContextCreate函数创建CGContextRef过程中,

    CGBitmapContextCreate(<#void * data#>, <#size_t width#>, <#size_t height#>, <#size_t bitsPerComponent#>, <#size_t bytesPerRow#>, <#CGColorSpaceRef colorspace#>, <#CGBitmapInfo bitmapInfo#>)

最后一个参数CGBitmapInfo在这里很关键。

只有使用kCGImageAlphaPremultipliedFirst才会让该函数创建一个XRGB Context,这样的bitmap在绘制时才会真正透明alpha为0的部分. 就会出现擦去上面一层的时候露出底下的图像。
如果使用kCGImageAlphaNoneSkipLast或其它.... 会创建一个ARGB Context,这样的结果是所以alpha为0的部分都是以黑色绘制。

转自:
http://www.cocoachina.com/bbs/read.php?tid=44397

你可能感兴趣的:(iPhone)