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