![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinHu-mqGe-9V6HbHzgzuf8Nl9sIy0A0WJuh5Swdmqh5B-1q9P54uefEj4QR4MSW0b4QgZuZiI5AG3SN_99Oo6rVkGVB7Fi3AgH1W_1W7AwXSbrbG0Pj7wjqGMJO75IqAFpGE6P6u4AhqdC/s320/IMG_0658.png)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4H3ER4uyHoToi2CakCi5pxSn55Zhm4Qe-xOTK5vVay8mOEGwCThg58zsSG8C4wJLkhDdh9d5Vsi9bevFRMkTe3c_kkW1EuGsQYewgOnT12t0mvTxs7ci2oSKYD4Oyq4GggIS-kn_kQSIK/s320/IMG_0657.png)
改變一張影像的色調有很多方法,最直覺的方式莫過於將該影像中的所有像素點 Pixel 取出,在經過飽和或是色相等換算之後在置入回 UIImage 中,但是這種方式不再本篇的討論範圍內,這邊要示範的是使用 CoreGraphics 所提供的函式,來達成類似的效果,其程式碼如下。
UIImage *iconImage = [UIImage imageNamed:@"logo.png"];
UIGraphicsBeginImageContext(iconImage.size);
//設定參考範圍
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextScaleCTM(context, 1, -1);
CGRect region = CGRectMake(0, 0, iconImage.size.width, iconImage.size.height);
CGContextTranslateCTM(context, 0, -region.size.height);
CGContextSaveGState(context);
//可以有保留透明背景的效果
CGContextClipToMask(context, region, iconImage.CGImage);
//設定純色遮罩顏色
[[UIColor colorWithRed:0.1 green:1.0 blue:0.1 alpha:1.0] set];
//將顏色與原影像混和
CGContextFillRect(context, region);
CGContextRestoreGState(context);
CGContextSetBlendMode(context, kCGBlendModeMultiply);
CGContextDrawImage(context, region, iconImage.CGImage);
//將UIImage影像指定給UIImageView
imageView.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
間單說明一下製作次效果的流程,首先要先取得影像的大小,之後根據此影像大小我們製作一個「純色」的遮罩,當然讀者有興趣也可以使用不同的紋理來當作遮罩,最後繪製一個純色的矩形並與原始影像混合,兩張影像混合的規則是由 kCGBlendModeMultiply 來決定的。
沒有留言:
張貼留言