iphone橡皮擦功能的实现

本文介绍了如何在绘图应用中正确实现橡皮擦功能。通过设置CGContext的混色模式为kCGBlendModeClear,可以实现图像数据的清除。此外,文章详细解释了CGBitmapContextCreate函数中CGBitmapInfo参数的重要性,并指出使用kCGImageAlphaPremultipliedFirst才能确保绘制时alpha为0的部分真正透明。
如何正确的实现橡皮擦功能

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值