c# 画热力图(一)

 public class HeatMap
    {
        public float BrushStop { get; set; }
        public int Radius { get; set; }
        private struct HeatPoint
        {
            public Point point;
            public int value;
            public HeatPoint(Point point, int value)
            {
                this.point = point;
                this.value = value;
            }
        }
        private List<HeatPoint> _heatPoints = new List<HeatPoint>();


        public void AddPoint(Point point, int value)
        {
            _heatPoints.Add(new HeatPoint(point, value));
        }

        public void Draw(ref Bitmap bitmap)
        {
            Graphics surface = Graphics.FromImage(bitmap);

            foreach (HeatPoint heatPoint in _heatPoints)
                DrawHeatPoint(surface, heatPoint);

            surface.Dispose();
        }

        private System.Drawing.Drawing2D.ColorBlend GetColorBlend(int value)
        {
            System.Drawing.Drawing2D.ColorBlend colors = new System.Drawing.Drawing2D.ColorBlend(3);

            colors.Positions = new float[3] { 0, BrushStop, 1 };

            colors.Colors = new Color[3]
            {
                Color.FromArgb(0, Color.White),
                Color.FromArgb(value, Color.Black),
                Color.FromArgb(value, Color.Black)
            };
            return colors;
        }

        private void DrawHeatPoint(Graphics surface, HeatPoint heatPoint)
        {
            int x = heatPoint.point.X - Radius;
            int y = heatPoint.point.Y - Radius;
            int len = 2 * Radius;

            var ellipsePath = new System.Drawing.Drawing2D.GraphicsPath();
            ellipsePath.AddEllipse(x, y, len, len);

            System.Drawing.Drawing2D.PathGradientBrush brush = new System.Drawing.Drawing2D.PathGradientBrush(ellipsePath);
            System.Drawing.Drawing2D.ColorBlend gradientSpecifications = GetColorBlend(heatPoint.value);
            brush.InterpolationColors = gradientSpecifications;

            surface.FillEllipse(brush, x, y, len, len);
        }

        public void Colorize(ref Bitmap bitmap, string paletteFile)
        {
            int[] palette = LoadPalette(paletteFile);

            for (int y = 0; y < bitmap.Height; y++)
            {
                for (int x = 0; x < bitmap.Width; x++)
                    bitmap.SetPixel(x, y, Color.FromArgb(palette[(byte)~(((uint)(bitmap.GetPixel(x, y).ToArgb())) >> 24)]));
            }
        }

        private int[] LoadPalette(string paletteFile)
        {
            int[] palette = new int[256];
            Bitmap paletteImage = (Bitmap)Bitmap.FromFile(paletteFile);
            for (int i = 0; i < palette.Length - 1; i++)
            {
                palette[i] = paletteImage.GetPixel(i, 0).ToArgb();
            }
            palette[palette.Length - 1] = 0;
            return palette;
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值