顏色混合

設(shè)計(jì)給了一個(gè)需求膜眠,需要在圖片的點(diǎn)擊態(tài)下增加 10%的黑色遮罩籽孙。并且只在有 alpha 通道的像素增加。于是需要進(jìn)行顏色的混合伐蒋。iOS 的同學(xué)已經(jīng)做完了工三,于是要了算法

- (UIColor *)bmbw_addColor:(UIColor *)addColor {
  NSArray *baseColorArr = [self bmbw_getRGBA];
  NSArray *addColorArr = [addColor bmbw_getRGBA];

  CGFloat alpha1 = [baseColorArr[3] doubleValue];
  CGFloat alpha2 = [addColorArr[3] doubleValue];
  CGFloat alpha = alpha1 + alpha2 - alpha1 * alpha2;

  CGFloat red1 = [baseColorArr[0] doubleValue];
  CGFloat red2 = [addColorArr[0] doubleValue];
  CGFloat red = (red1 * alpha1 * (1.0 - alpha2) + red2 * alpha2) / alpha;

  CGFloat green1 = [baseColorArr[1] doubleValue];
  CGFloat green2 = [addColorArr[1] doubleValue];
  CGFloat green = (green1 * alpha1 * (1.0 - alpha2) + green2 * alpha2) / alpha;

  CGFloat blue1 = [baseColorArr[2] doubleValue];
  CGFloat blue2 = [addColorArr[2] doubleValue];
  CGFloat blue = (blue1 * alpha1 * (1.0 - alpha2) + blue2 * alpha2) / alpha;

  return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
}

- (NSArray *)bmbw_getRGBA {
  CGFloat red = 0.0;
  CGFloat green = 0.0;
  CGFloat blue = 0.0;
  CGFloat alpha = 0.0;
  [self getRed:&red green:&green blue:&blue alpha:&alpha];
  return @[@(red), @(green), @(blue), @(alpha)];
}

發(fā)現(xiàn) iOS 的算法對(duì)于通道的取值是從 0-1 的,而 Android 是0x00 到0xff先鱼,于是要修改一下算法

private Bitmap mixBitmap(Bitmap bitmap) {
    int width = bitmap.getWidth();
    int height = bitmap.getHeight();

    // 保存所有的像素的數(shù)組俭正,圖片寬×高
    int[] pixels = new int[width * height];
    int[] newPixels = new int[width * height];

    bitmap.getPixels(pixels, 0, width, 0, 0, width, height);

    int addAlpha = 0x1A;
    int addRed = 0x00;
    int addGreen = 0x00;
    int addBlue = 0x00;


    for (int i = 0; i < pixels.length; i++) {
      int clr = pixels[i];
      int alpha = (clr & 0xff000000) >>> 24;
      if (alpha == 0x00) {
        pixels[i] = 0x00ffffff;
        continue;
      }
      int red = (clr & 0x00ff0000) >>> 16;
      int green = (clr & 0x0000ff00) >>> 8;
      int blue = clr & 0x000000ff;
      //
      int mixAlpha = alpha + addAlpha - alpha * addAlpha / 0xff;
      int mixRed = mixColor(red, alpha, addRed, addAlpha, mixAlpha);
      int mixGreen = mixColor(green, alpha, addGreen, addAlpha, mixAlpha);
      int mixBlue = mixColor(blue, alpha, addBlue, addAlpha, mixAlpha);
      newPixels[i] = Color.argb(mixAlpha, mixRed, mixGreen, mixBlue);
    }
    return Bitmap.createBitmap(newPixels, width, height, Bitmap.Config.ARGB_8888);
  }

  private int mixColor(int or, int oa, int ar, int aa, int ma) {
    return ((or * oa * (0xff - aa) + ar * aa * 0xff) / ma) /0xff;
  }

算法中采取>>>而不是>>,是因?yàn)楫?dāng) 在進(jìn)行移位的時(shí)候需要用0 補(bǔ)齊,不然 aplha 是0xff 的時(shí)候焙畔,通過>>會(huì)得到-1掸读;
有些地方用/0xff 而不是>>>8,是為了進(jìn)位宏多。如果用>>>8實(shí)際的時(shí)候發(fā)現(xiàn)有時(shí)候 mixAplha 是 256,而/0xff 則是255;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末儿惫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子伸但,更是在濱河造成了極大的恐慌肾请,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件更胖,死亡現(xiàn)場(chǎng)離奇詭異铛铁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)却妨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門饵逐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人管呵,你說我怎么就攤上這事梳毙。” “怎么了捐下?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵账锹,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我坷襟,道長(zhǎng)奸柬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任婴程,我火速辦了婚禮廓奕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己桌粉,他們只是感情好蒸绩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著铃肯,像睡著了一般患亿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上押逼,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天步藕,我揣著相機(jī)與錄音,去河邊找鬼挑格。 笑死咙冗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的漂彤。 我是一名探鬼主播雾消,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼显歧!你這毒婦竟也來了仪或?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤士骤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蕾域,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拷肌,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年旨巷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了巨缘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡采呐,死狀恐怖若锁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情斧吐,我是刑警寧澤又固,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站煤率,受9級(jí)特大地震影響仰冠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蝶糯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一洋只、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦识虚、人聲如沸肢扯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鹃彻。三九已至,卻和暖如春妻献,著一層夾襖步出監(jiān)牢的瞬間蛛株,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工育拨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谨履,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓熬丧,卻偏偏與公主長(zhǎng)得像笋粟,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子析蝴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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

  • 最近這段時(shí)間在搞openGL ES處理視頻和圖像害捕,要進(jìn)行紋理混合,重新溫習(xí)了一下大學(xué)時(shí)候的課本闷畸,找了一些資料尝盼,把一...
    北冥有貓其名為喵閱讀 33,303評(píng)論 5 19
  • 混合是什么呢?混合就是把兩種顏色混在一起佑菩。具體一點(diǎn)盾沫,就是把某一像素位置原來的顏色和將要畫上去的顏色,通過某種方式混...
    落寒z閱讀 8,691評(píng)論 0 7
  • 我們把OpenGL渲染時(shí)會(huì)把顏?色值存在顏?緩存區(qū)中殿漠,每個(gè)片段的深度值也是放在深度緩沖區(qū)赴精。當(dāng)深度 緩沖區(qū)被關(guān)閉時(shí),...
    hie閱讀 510評(píng)論 0 0
  • Blend是OpenGL中的一個(gè)非常重要的部分绞幌,它可以讓每個(gè)輸出的源和目的顏色以多種方式組合在一起蕾哟,以呈現(xiàn)出不同的...
    大大大大大大的大大閱讀 4,561評(píng)論 3 4
  • 1、概念“混合”是指兩種顏色的疊加方式莲蜘。在新圖片將要渲染畫到屏幕上的時(shí)候谭确,將用在新圖片中的紅、綠菇夸、藍(lán)和透明度信息琼富,...
    babybus_break閱讀 3,396評(píng)論 0 1