C#实现简易灰度图和酷炫HeatMap热力图winform(附DEMO)

 更新时间:2021年12月10日 16:32:27   作者:小康师兄  
本文主要介绍了C#实现简易灰度图和酷炫HeatMap热力图winform(附DEMO),文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

一、效果展示

在这里插入图片描述

在这里插入图片描述

二、随机生成热力点

热力点类

    class HeatPoint
    {
        public int X;
        public int Y;
        public byte Intensity;
        public HeatPoint(int iX, int iY, byte bIntensity)
        {
            X = iX;
            Y = iY;
            Intensity = bIntensity;
        }
    }

随机生成热力点

privatevoid generateBtn_Click(object sender, EventArgs e)
{
    Random rRand = new Random();
    for (int i = 0; i < 500; i++)
    {
        int iX = rRand.Next(0, 800);
        int iY = rRand.Next(0, 800);
        byte iIntense = (byte)rRand.Next(0, 180);
        heatPoints.Add(new HeatPoint(iX, iY, iIntense));
    }
    UpdateView();
}

三、灰度图生成解析

private Bitmap CreateIntensityMask(Bitmap bitmap, List<HeatPoint> aHeatPoints)
{
    Graphics graphics = Graphics.FromImage(bitmap);
    graphics.Clear(System.Drawing.Color.White);
    foreach (HeatPoint point in aHeatPoints)
    {
        if (point.Intensity * 30 / 180 == 0)
            continue;
        DrawHeatPoint(graphics, point, point.Intensity * 30 / 180);
        //DrawHeatPoint(graphics, point, 15);
    }
    return bitmap;
}

//此方法用于在绘图表面上绘制实际的径向渐变“点”。这可能是整个项目中最重要的方法,因为它可以处理不同大小和密度的绘图点。
private void DrawHeatPoint(Graphics graphics, HeatPoint HeatPoint, int radius)
{
    List<System.Drawing.Point> pointsList = new List<System.Drawing.Point>();  
    for (double degrees = 0; degrees <= 360; degrees += 10)
    {
        // 在定义半径的圆的圆周上绘制新点
        // 使用点坐标、半径和角度
        // 计算这个迭代点在圆上的位置
        System.Drawing.Point point = new System.Drawing.Point();
        point.X = Convert.ToInt32(HeatPoint.X + radius * Math.Cos((Math.PI / 180) * degrees));
        point.Y = Convert.ToInt32(HeatPoint.Y + radius * Math.Sin((Math.PI / 180) * degrees));
        pointsList.Add(point);
    }


    // 创建新的颜色混合来告诉 PathGradientBrush 使用什么颜色以及放置它们的位置
    ColorBlend colorBlend = new ColorBlend(3);

    // 计算比例以将字节强度范围从 0-255 缩放到 0-1
    float fRatio = 1F / Byte.MaxValue;
    // 预计算字节最大值的一半
    byte bHalf = Byte.MaxValue / 2;
    // 将其中心值的强度从低高翻转到高低
    int iIntensity = (byte)(HeatPoint.Intensity - ((HeatPoint.Intensity - bHalf) * 2));
    // 存储缩放和翻转的强度值以用于梯度中心位置
    float fIntensity = iIntensity * fRatio;
    // 定义渐变颜色的位置,使用intesity将中间颜色调整为
    colorBlend.Positions = new float[3] { 0, fIntensity, 1 };
    colorBlend.Colors = new System.Drawing.Color[3]
    {
        System.Drawing.Color.FromArgb(0, System.Drawing.Color.White),
        System.Drawing.Color.FromArgb(HeatPoint.Intensity, System.Drawing.Color.Black),
        System.Drawing.Color.FromArgb(HeatPoint.Intensity, System.Drawing.Color.Black)
    };

    // 创建新的 PathGradientBrush 以使用圆周点创建径向渐变
    PathGradientBrush brush = new PathGradientBrush(pointsList.ToArray());
    // 将颜色混合传递给 PathGradientBrush 以指示它如何生成渐变
    brush.InterpolationColors = colorBlend;
    graphics.FillPolygon(brush, pointsList.ToArray());
}

四、热力图生成解析

public static Bitmap Colorize(Bitmap Mask, byte Alpha)
{
    Bitmap Output = new Bitmap(Mask.Width, Mask.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
    Graphics Surface = Graphics.FromImage(Output);
    Surface.Clear(System.Drawing.Color.Transparent);

    // 构建一组颜色映射以将我们的灰度蒙版重新映射为全色
    // 接受一个 alpha 字节来指定输出图像的透明度
    ColorMap[] Colors = CreatePaletteIndex(Alpha);

    // 创建新的图像属性类来处理颜色重新映射
    // 注入我们的颜色映射数组来指示图像属性类如何进行着色
    ImageAttributes Remapper = new ImageAttributes();
    Remapper.SetRemapTable(Colors);

    // 使用新的颜色映射方案将我们的蒙版绘制到我们的内存位图工作表面上
    Surface.DrawImage(Mask, new System.Drawing.Rectangle(0, 0, Mask.Width, Mask.Height), 0, 0, Mask.Width, Mask.Height, GraphicsUnit.Pixel, Remapper);
    return Output;
}

private static ColorMap[] CreatePaletteIndex(byte Alpha)
{
    ColorMap[] OutputMap = new ColorMap[256];

    Assembly myAssembly = Assembly.GetExecutingAssembly();
    Stream myStream = myAssembly.GetManifestResourceStream("热力图Demo.Image.gradient-palette.jpg");
    Bitmap Palette = new Bitmap(myStream);
    for (int X = 0; X <= 255; X++)
    {
        OutputMap[X] = new ColorMap();
        OutputMap[X].OldColor = System.Drawing.Color.FromArgb(X, X, X);
        OutputMap[X].NewColor = System.Drawing.Color.FromArgb(Alpha, Palette.GetPixel(X, 0));
    }
    return OutputMap;
}

五、源码下载

热力图Demo.zip

到此这篇关于C#实现简易灰度图和酷炫HeatMap热力图winform(附DEMO)的文章就介绍到这了,更多相关C#  灰度图和热力图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#事件处理和委托event delegate实例简述

    C#事件处理和委托event delegate实例简述

    这篇文章主要介绍了C#事件处理和委托event delegate的简单实例,较为详细的讲述了C#事件处理和委托的声明与实现过程,代码简单易懂,需要的朋友可以参考下
    2014-09-09
  • 获取wince mac地址与IP地址解决方案

    获取wince mac地址与IP地址解决方案

    由于需要进行身份的验证,需要获取移动终端的MAC地址,于是在网上进行搜索整理一番,现在将实现获取MAC地址的方法与大家共享
    2012-12-12
  • 聊聊Unity自定义组件之序列帧播放组件问题

    聊聊Unity自定义组件之序列帧播放组件问题

    由于最近的项目中需要用到大量的序列帧动画以及逻辑处理,本来想用Unity自带的Animation组件来实现的,但由于甲方需求一再变更,需要处理的逻辑太多,为了方便修改和拓展,所以就根据自己项目的需求自定义了一个序列帧播放组件来辅助开发
    2022-01-01
  • C#基础知识系列八const和readonly关键字详细介绍

    C#基础知识系列八const和readonly关键字详细介绍

    这篇文章主要介绍了C#中的const和readonly关键字,有需要的朋友可以参考一下
    2014-01-01
  • WPF通过使用C#代码给控件赋值

    WPF通过使用C#代码给控件赋值

    开发中偶尔会用到使用c#代码给控件赋值,这里需要通过F12找到控件的赋值类型,然后在看控件可以使用那种方式赋值,花点时间研究一下,基本都可以通过c#代码给控件赋值的,需要的朋友可以参考下
    2023-09-09
  • C# 位图BitArray的使用

    C# 位图BitArray的使用

    如果我们着重处理一个以位为单位的数据时,就可以考虑使用位数组。本文就介绍了C# 位图BitArray的使用,感兴趣的可以了解一下
    2021-06-06
  • C#迭代器方法介绍

    C#迭代器方法介绍

    这篇文章主要介绍了C#迭代器方法,可以使用foreach循环语句进行的迭代的方法,称为可迭代方法,或者迭代器方法,方法操作,想了解更多内容得小伙伴可以学习下面文章内容,希望给你的学习带来帮助
    2022-03-03
  • C#笔试题之同线程Lock语句递归不会死锁

    C#笔试题之同线程Lock语句递归不会死锁

    这篇文章主要介绍了C$ 笔试题之同线程Lock语句递归不会死锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • c#判断代码是否执行超时的几种方式总结

    c#判断代码是否执行超时的几种方式总结

    这篇文章主要介绍了c#判断代码是否执行超时的几种方式总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • C#实现设置Excel表格中文本对齐方式和格式

    C#实现设置Excel表格中文本对齐方式和格式

    这篇文章主要为大家详细介绍了如何在.NET 程序中通过C# 设置Excel单元格中文本的对齐方式,方向以及换行,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-04-04

最新评论