2015年4月14日火曜日

熱画像みたいな色を作る


0.0fから1.0fまでの値を熱画像のような色にシームレスに作ります
今回のサンプルではコサインテーブルが必要になるので、環境によってはコストが高いです
色を正弦波ではなく三角波で変化させると視覚上の明るさが変化してしまい、あまりシームレスな変化にはなりません



using System;
using System.Drawing;
using System.Windows.Forms;

namespace ColorTest {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e) {
            Bitmap bmp = new Bitmap(300, 1000);

            using (Graphics gra = Graphics.FromImage(bmp)) {
                for (int i = 0; i < bmp.Height; i++) {
                    float d = (float)(bmp.Height - i) / bmp.Height;

                    Color clr = val2clr(d);

                    using (Pen pen = new Pen(clr)) {
                        gra.DrawLine(pen, 0, i, bmp.Width, i);
                    }
                }

                using (Pen pen = new Pen(val2clr(-1))) {
                    gra.FillRectangle(pen.Brush, new Rectangle(10, (bmp.Height / 2) - 15, 30, 30));
                }

                using (Pen pen = new Pen(val2clr(+2))) {
                    gra.FillRectangle(pen.Brush, new Rectangle(50, (bmp.Height / 2) - 15, 30, 30));
                }
            }

            SetImage(bmp);
            Clipboard.SetImage(bmp);
        }

        Color val2clr(float val) {
            int r,g,b;

            if (val < 0.0f) {
                r = 0;
                g = 0;
                b = 255;
            } else if (val < 0.5f) {
                r = 0;
                g = (int)(255 * Math.Cos((val + 0.5f) * Math.PI)) * -1;
                b = (int)(255 * Math.Cos((val) * Math.PI));
            } else if (val < 1.0f) {
                r = (int)(255 * Math.Cos((val) * Math.PI)) * -1;
                g = (int)(255 * Math.Cos((val - 0.5f) * Math.PI));
                b = 0;
            } else {
                r = 255;
                g = 0;
                b = 0;
            }

            return (Color.FromArgb(r, g, b));
        }

        void SetImage(Bitmap bmp) {
            if (pictureBox1.Image != null) {
                pictureBox1.Image.Dispose();
            }

            pictureBox1.Image = bmp;
            Size += bmp.Size - pictureBox1.Size;
        }
    }
}

0 件のコメント:

コメントを投稿