伪彩色

就是把原来的颜色换成制定的颜色。

通常把灰化的东西还原成彩色

灰色的东西上次说了主要是3个值一样如

(1,1,1)

(2,2,2)

(255,255,255)

那么只要把255制定一种颜色如255 的是(30,54,23)那么也就是把点换成了另外的颜色

换法很多,一般有三种

1.曲线函数

2.颜色映射

3.颜色手动制定

不过也255中颜色太多,有时候吧255换成16,32就少了很多,手动制定的时候就方便些

方法也很简单Gray/255*16就是换成16色对应的了。因为得到的数肯定是16以内的整数,所以做个索引表就OK 了。如

1.红

2.蓝

3.紫

16.土黄

下面是颜色映射,一般把浅色对应蓝,红色对应深色。

image

映射话就是把渐变的东西换下就成。我没有用默认的函数LinearGradientBrush而是自己写了个,刚开始怎么也弄不对,后来发现是整数会缺,用了浮点转化的时候再转成int就成,不过这个方法有缺陷,效率不高,如果是颜色相近的不需要每个点抠,就先这样了,以后有空再改进吧。

Graphics graphics = e.Graphics;        
float range = (float)(this.Width) / (Colors.Count - 1);            
Pen pen = new Pen(Color.FromArgb(0, 0, 0));

for (int i = 1; i < Colors.Count; i++)
{
    float r = Colors[i - 1].R;
    float g = Colors[i - 1].G;
    float b = Colors[i - 1].B;
 
    float rSub = (Colors[i].R - r) / range;
    float gSub = (Colors[i].G - g) / range;
    float bSub = (Colors[i].B - b) / range;

    for (int j = 0; j < range; j++)
    {
        int width = (int)range*(i - 1) + j;
        pen.Color = Color.FromArgb((int)r, (int)g, (int)b);
        r += rSub;
        g += gSub;
        b += bSub;

        e.Graphics.DrawLine(pen, width, 0, width, this.Height);
    }
}

pen.Dispose();

这里的变量我没有提出来,因为变量最好是用到哪声明在哪,但没有测试过效率。Colors就是一个数组

private List<Color> _colors;
public List<Color> Colors
{
    get
    {
        if (_colors == null)
            _colors = new List<Color>(5);
        return _colors;
    }
    set { _colors = value; }
}

现在的VS也真够意思,自动的已经把对应的Design做好了,赞!

用这个可以看光线的强弱哦

效果图:

image

原图:

image

其实这个在地理上更有优势,可以看轻地势的层次。

不过我做的这个还不行,就不献丑了。

算法也很烂,还是贴下吧,真要最求速度肯定是要把黑白的颜色先做个映射表的

public static Bitmap TurnToPseudoColors(Bitmap b,List<Color> colors)
{
    ColorDelegate colorDelegate = (ref int red, ref int green, ref int blue) =>
    {
        int gray = Math.Max(Math.Max(red, green), blue);

        float value = gray/255f*colors.Count-1;
        if (value < 0)
            value = 0;
        int integerValue = (int)value;
        float decimalValue = value - integerValue;

        int nextIndex = integerValue < (colors.Count - 1) ? integerValue + 1 : integerValue;

        red = colors[integerValue].R + (int)((colors[nextIndex].R - colors[integerValue].R) * decimalValue);
        green = colors[integerValue].G + (int)((colors[nextIndex].G - colors[integerValue].G) * decimalValue);
        blue = colors[integerValue].B + (int)((colors[nextIndex].B - colors[integerValue].B) * decimalValue);
    };

    return LoopPixel(b, colorDelegate);
}

posted on 2010-01-25 00:45  六道众生  阅读(647)  评论(0编辑  收藏  举报

导航