RGB色的图片有255*255*255=16581375种颜色,如果再加上透明度ARGB就要再乘以255,这么多的颜色在图形处理中有时不需要使用那么多的颜色,只需要转化成8色、16色或者256色就可以了,而透明度则作特殊处理,比如在阀值80以下的定为透明,80以上的定为不透明,透明的则用0号索引色,不透明的就用大于0的索引色,这样就在一定程度上转化了图片的颜色同时又保留了一定的透明度,在有些场景中是可以用的。下面是转化的代码.
#region To8Color/// <summary>/// 8色化/// </summary>/// <returns></returns>public int To8Color(){//8色化处理,取RGB的高1位相与。var r1 = (R >> 5) & 0x4;var g1 = (G >> 6) & 0x2;var b1 = (B >> 7);var c = (r1 | g1 | b1) + 1;//0表示透明,1-8表示颜色索引。return c;}#endregion#region To8Color/// <summary>/// 16色化/// </summary>/// <returns></returns>public int To16Color(){//16色系统调色板://0 = RGB(0, 0, 0) = 0x00000000;//1 = RGB(128, 0, 0) = 0x00000080;//2 = RGB(0, 128, 0) = 0x00008000;//3 = RGB(128, 128, 0) = 0x00008080;//4 = RGB(0, 0, 128) = 0x00800000;//5 = RGB(128, 0, 128) = 0x00800080;//6 = RGB(0, 128, 128) = 0x00808000;//7 = RGB(128, 128, 128) = 0x00808080;//8 = RGB(192, 192, 192) = 0x00c0c0c0;//9 = RGB(255, 0, 0) = 0x000000ff;//10 = RGB(0, 255, 0) = 0x0000ff00;//11 = RGB(255, 255, 0) = 0x0000ffff;//12 = RGB(0, 0, 255) = 0x00ff0000;//13 = RGB(255, 0, 255) = 0x00ff00ff;//14 = RGB(0, 255, 255) = 0x00ffff00;//15 = RGB(255, 255, 255) = 0x00ffffff;//16色化处理,取R、G的高1位和B的高2位相与var r1 = (R >> 4) & 0x8;var g1 = (G >> 5) & 0x4;var b1 = (B >> 6) & 0x3;var c = (r1 | g1 | b1) + 1;//0表示透明,1-16表示颜色索引。return c;}#endregion#region To256Color/// <summary>/// 256色/// </summary>/// <returns></returns>public int To256Color(){var c = (int)(0.299 * R + 0.587 * G + 0.114 * B);//0表示透明,1-256表示颜色索引。c = c & 0xFF;return c;}#endregion
8色、16色和256色都需要设置对应的调色板,代码中给出了16色的调色板。具体的调色板可以依据RGB色中某些颜色的占比而设定。
转载请注明出处。