iOS 圖像的渲染/重繪成不同顏色

iOS 圖像的渲染模式

最近做項(xiàng)目需要減小圖片資源, 原本通過(guò)不同的背景圖片進(jìn)行界面主題等內(nèi)容切換,現(xiàn)在需要直接通過(guò)渲染改變背景圖片的顏色. 這里就涉及到圖片的渲染顏色, 這里一般而言有兩種方式.

1. 直接使用tintColor解決

iOS7的時(shí)候,UIView有一個(gè)新增加屬性叫做tintColor, 這個(gè)屬性是一個(gè)非默認(rèn)的著色顏色值, 會(huì)影響以這個(gè)View為根的所有視圖層次結(jié)構(gòu)的顏色. 我們常見(jiàn)的app圖標(biāo), navigationBar, Tabbar等控件,都有默認(rèn)的tintColor.具體的相關(guān)內(nèi)容請(qǐng)參考 詳解UIView的TintColor屬性.

其中比較特殊的是UIImageView中image的渲染顏色, 對(duì)于UIImage,我們需要設(shè)置image的渲染模式成AlwaysTemplate, 這樣會(huì)將該圖的每一個(gè)像素如果其alpha通道為1, 那么將它的顏色設(shè)置成tintColor, 如果alpha通道不為1(半透明或者透明),那么該像素會(huì)渲染成透明, 這樣就滿(mǎn)足了我們的需求.

// 加載圖片
var image = UIImage(named: "text.jpg")
// 設(shè)置渲染模式
image = image?.imageWithRenderingMode(.AlwaysTemplate)
self.imageView?.image = image 
// 設(shè)置需要渲染成的tintColor, 那么UIImage會(huì)根據(jù)每個(gè)像素是否透明進(jìn)行渲染
self.imageView.tintColor = UIColor.red

當(dāng)然UIImage也有其他的渲染模式, 默認(rèn)請(qǐng)求下UIImage渲染成圖片的原始顏色

2. 使用CoreGraphic重繪

當(dāng)前tintColor方法里面,只能改變圖片的渲染顏色, 如果對(duì)圖片還有其他的處理要求, 那么就只能通過(guò)CoreGraphic來(lái)對(duì)圖片進(jìn)行重繪了.

圖片的拉伸每瞒,渲染swift實(shí)現(xiàn)一個(gè)與智能機(jī)器人聊天的app(二) 文章里面提到的需求類(lèi)似, 具體的繪制方法如下:

- (UIImage *)coloredImage:(UIImage *)image red:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpa:(CGFloat)alpa {
    // 獲取圖片大小
    CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
    // 創(chuàng)建位圖繪圖上下文
    UIGraphicsBeginImageContextWithOptions(image.size, false, image.scale);
    // 獲取位圖繪圖上下文并開(kāi)始渲染操作
    CGContextRef context = UIGraphicsGetCurrentContext();
    [image drawInRect:rect];

// 全局渲染成需要的顏色(會(huì)和圖片進(jìn)行混合, 只要設(shè)置成混合模式是kCGBlendModeSourceAtop, 就能得到圖片輪廓但是圖顏色是我們需要的顏色)
    CGContextSetRGBFillColor(context, red, green, blue, alpa);
// 純色圖片渲染的關(guān)鍵設(shè)置
    CGContextSetBlendMode(context, kCGBlendModeSourceAtop);
// 全局渲染顏色
    CGContextFillRect(context, rect);
    // 獲取到繪圖結(jié)果,結(jié)束位圖繪圖上下文并返回繪圖結(jié)果
    UIImage *resulet = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return resulet;
}

上面的方法就是對(duì)傳入的圖片進(jìn)行染色處理,相關(guān)的解釋在代碼里有, 但是這樣處理只能將圖片處理成純色圖片, 如果原始圖片是有一定透明度變化的的gradient圖是無(wú)法滿(mǎn)足需求的, 但是第一種使用tintColor就能滿(mǎn)足需求

其中還有一部分使用的是圖片拉伸相關(guān)內(nèi)容, 這里也貼出來(lái):

- (void)viewDidAppear:(BOOL)animated {
    NSString *imageName = @"MessageBubble";
    UIImage *image = [UIImage imageNamed:imageName];

    // 原始的圖片
    UIImageView *originView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 200, 48, 35)];
    originView.image = image;

    // 尖頭向右的圖片
    UIImage *rightImage = [self coloredImage:image red:51/255.0 green:123/255.0 blue:214/255.0 alpa:1];
    // 設(shè)置可拉伸區(qū)域
    rightImage = [rightImage resizableImageWithCapInsets:UIEdgeInsetsMake(17, 21, 17.5, 26.5)];
    UIImageView *rightImageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 300, 320, 100)];
    rightImageView.image = rightImage;

    // 尖頭向左的圖片
    UIImage *leftImage = [UIImage imageWithCGImage:image.CGImage scale:2.0 orientation:UIImageOrientationUpMirrored];
    leftImage = [self coloredImage:leftImage red:255/255.0 green:0.0 blue:0.0 alpa:1];
    leftImage = [leftImage resizableImageWithCapInsets:UIEdgeInsetsMake(17, 26.5, 17.5, 21)];
    UIImageView *leftImageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 450, 320, 100)];
    leftImageView.image = leftImage;

    // 將他們顯示出來(lái)
    [self.view addSubview:originView];
    [self.view addSubview:rightImageView];
    [self.view addSubview:leftImageView];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末勘高,一起剝皮案震驚了整個(gè)濱河市兽泣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌袍辞,老刑警劉巖浆兰,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異家妆,居然都是意外死亡鸵荠,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)伤极,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蛹找,“玉大人,你說(shuō)我怎么就攤上這事哨坪∮辜玻” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵当编,是天一觀的道長(zhǎng)届慈。 經(jīng)常有香客問(wèn)我,道長(zhǎng)忿偷,這世上最難降的妖魔是什么金顿? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮鲤桥,結(jié)果婚禮上揍拆,老公的妹妹穿的比我還像新娘。我一直安慰自己茶凳,他們只是感情好嫂拴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著慧妄,像睡著了一般顷牌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上塞淹,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天窟蓝,我揣著相機(jī)與錄音,去河邊找鬼饱普。 笑死运挫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的套耕。 我是一名探鬼主播谁帕,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼冯袍!你這毒婦竟也來(lái)了匈挖?” 一聲冷哼從身側(cè)響起碾牌,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎儡循,沒(méi)想到半個(gè)月后舶吗,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡择膝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年誓琼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肴捉。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腹侣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出齿穗,到底是詐尸還是另有隱情傲隶,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布缤灵,位于F島的核電站伦籍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏腮出。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一芝薇、第九天 我趴在偏房一處隱蔽的房頂上張望胚嘲。 院中可真熱鬧,春花似錦洛二、人聲如沸馋劈。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)妓雾。三九已至,卻和暖如春垒迂,著一層夾襖步出監(jiān)牢的瞬間械姻,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工机断, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留楷拳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓吏奸,卻偏偏與公主長(zhǎng)得像欢揖,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奋蔚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 原文鏈接:https://onevcat.com/2013/04/using-blending-in-ios/ 最...
    MxlZlh閱讀 949評(píng)論 1 0
  • 許多UIView的子類(lèi)她混,如一個(gè)UIButton或一個(gè)UILabel烈钞,它們知道怎么繪制自己。遲早坤按,你也將想要做一些自...
    shenzhenboy閱讀 1,642評(píng)論 2 8
  • 冷月獨(dú)掛 相思與誰(shuí)話 危墻欲塌 留戀同誰(shuí)共 落霞倚穹 孤苦遇誰(shuí)訴 涼風(fēng)襲面 離殤逢誰(shuí)化 散了吧 花已落 人亦遠(yuǎn) 何...
    藜笙1998閱讀 351評(píng)論 0 2