en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

4.07.2011

CoreGraphics 材質紋理的合成

 

延續前一篇簡單改變 UIImage 色調的方法,這次我們將純色的遮罩改成 2D 材質紋理,並套用不同的混色分式,看看有什麼神奇的果,其程式碼如下。

下圖是我們所使用的 2D 材質紋理,在程式碼中它被命名為 textureImage。


以下程式碼,就是將我們的 Logo 與 textureImage 做合成的示範。

UIImage *iconImage = [UIImage imageNamed:@"logo.png"];
UIImage *textureImage = [UIImage imageNamed:@"texture.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);

//將材質紋理與原影像混和
CGContextDrawImage(context, region, textureImage.CGImage);
CGContextRestoreGState(context);
CGContextSetBlendMode(context, kCGBlendModeColor);
CGContextDrawImage(context, region, iconImage.CGImage);

//將影像指定給imageView
imageView.image = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

上述程式碼中 kCGBlendModeColor 部份,就是我們所使用的混合方式之一,它可以保留顏色的鮮明度並且依照材質紋理的亮度做適當的混合,當然在 CoreGraphics 中還有許多不同的混合定義 CGBlendMode,有興趣的讀者可以自行實驗。 






沒有留言:

張貼留言