图片预处理
大家好,我是阿赵。
这一篇主要讲一下对图形的颜色控制。
1、 图片转灰度
转灰度的计算,实际上是把一个图片每一个像素的颜色,都转变成对应的灰度值。在转变完之后,这个像素的rgb值都会变成一样。
最简单的转灰度方法,就是颜色值C=(R+G+B)/3。
for (int i = 0; i < cols.Length; i++)
{
grayCol = (cols[i].r + cols[i].g + cols[i].b)/3 ;
newCols[i] = new Color(grayCol, grayCol, grayCol, cols[i].a);
}
不过一般来说,很少会这样均值的计算灰度,而是按照公式:
C = R*0.3+ G*0.59+B*0.11。
for (int i = 0;i<cols.Length;i++)
{
grayCol = cols[i].r * 0.3f+ cols[i].g * 0.59f+ cols[i].b * 0.11f;
newCols[i] = new Color(grayCol,grayCol,grayCol, cols[i].a);
}
上图左边的是按照平均值做的灰度,右边是按照公式做的灰度。
可以看出,左边的图片会比较暗一点,右边的图会对比度高一点。
2、 图片对比度调节
对比度的调节,基本的原理是找一个中间灰度值的颜色,比如(0.5,0.5,0.5),然后用原图的每个色值和这个中间灰度值做Lerp插值。
假如调节插值是0,那么颜色会完全变成0.5,那么整张图都会变成灰色。
如果插值是1,那么整张图都没有变化,维持原来的颜色。
如果插值超过1,那么颜色对比会越来越强烈
如果插值小于0,那么值越小,颜色翻转得越厉害
public static Texture2D ContrastRatio(Texture2D tex,float value)
{
int width = tex.width;
int height = tex.height;
Texture2D newTex = new Texture2D(width, height);
Color halfCol = new Color(0.5f, 0.5f, 0.5f, 1);
Color[] cols = tex.GetPixels(0, 0, width, height);
Color[] newCols = new Color[cols.Length];
for(int i = 0;i<cols.Length;i++)
{
newCols[i] = ColorLerp(halfCol, cols[i], value);
}
newTex.SetPixels(newCols);
newTex.Apply();
return newTex;
}
3、 图片单通道调节
有时候我们会想增强图形的某个通道的颜色,降低某个通道的颜色
比如只保留红色通道
或者保持红绿通道不变,增强蓝色通道
这个处理分为2种可能:
- 单独控制三个通道
单独的对图片像素色值的某个一个通道增加或者减弱。这种做法一般是作用于颜色图片。增强或者减弱某一通道的效果。 - 保持三个通道的色值总和
这种做法一般不是正常的图片处理,而是绘制遮罩图的时候用的。比如我们用RGB三个值代表了一定的百分比,那么三个值加起来应该是100%。如果增加了其中一种色值,其他两种色值就要降低,以保持加起来的总和还是100%。