最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#實(shí)現(xiàn)簡(jiǎn)易灰度圖和酷炫HeatMap熱力圖winform(附DEMO)

 更新時(shí)間:2021年12月10日 16:32:27   作者:小康師兄  
本文主要介紹了C#實(shí)現(xiàn)簡(jiǎn)易灰度圖和酷炫HeatMap熱力圖winform(附DEMO),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

一、效果展示

在這里插入圖片描述

在這里插入圖片描述

二、隨機(jī)生成熱力點(diǎn)

熱力點(diǎn)類

    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;
        }
    }

隨機(jī)生成熱力點(diǎn)

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;
}

//此方法用于在繪圖表面上繪制實(shí)際的徑向漸變“點(diǎn)”。這可能是整個(gè)項(xiàng)目中最重要的方法,因?yàn)樗梢蕴幚聿煌笮『兔芏鹊睦L圖點(diǎn)。
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)
    {
        // 在定義半徑的圓的圓周上繪制新點(diǎn)
        // 使用點(diǎn)坐標(biāo)、半徑和角度
        // 計(jì)算這個(gè)迭代點(diǎn)在圓上的位置
        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);
    }


    // 創(chuàng)建新的顏色混合來(lái)告訴 PathGradientBrush 使用什么顏色以及放置它們的位置
    ColorBlend colorBlend = new ColorBlend(3);

    // 計(jì)算比例以將字節(jié)強(qiáng)度范圍從 0-255 縮放到 0-1
    float fRatio = 1F / Byte.MaxValue;
    // 預(yù)計(jì)算字節(jié)最大值的一半
    byte bHalf = Byte.MaxValue / 2;
    // 將其中心值的強(qiáng)度從低高翻轉(zhuǎn)到高低
    int iIntensity = (byte)(HeatPoint.Intensity - ((HeatPoint.Intensity - bHalf) * 2));
    // 存儲(chǔ)縮放和翻轉(zhuǎn)的強(qiáng)度值以用于梯度中心位置
    float fIntensity = iIntensity * fRatio;
    // 定義漸變顏色的位置,使用intesity將中間顏色調(diào)整為
    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)
    };

    // 創(chuàng)建新的 PathGradientBrush 以使用圓周點(diǎn)創(chuàng)建徑向漸變
    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);

    // 構(gòu)建一組顏色映射以將我們的灰度蒙版重新映射為全色
    // 接受一個(gè) alpha 字節(jié)來(lái)指定輸出圖像的透明度
    ColorMap[] Colors = CreatePaletteIndex(Alpha);

    // 創(chuàng)建新的圖像屬性類來(lái)處理顏色重新映射
    // 注入我們的顏色映射數(shù)組來(lái)指示圖像屬性類如何進(jìn)行著色
    ImageAttributes Remapper = new ImageAttributes();
    Remapper.SetRemapTable(Colors);

    // 使用新的顏色映射方案將我們的蒙版繪制到我們的內(nèi)存位圖工作表面上
    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

到此這篇關(guān)于C#實(shí)現(xiàn)簡(jiǎn)易灰度圖和酷炫HeatMap熱力圖winform(附DEMO)的文章就介紹到這了,更多相關(guān)C#? 灰度圖和熱力圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#事件處理和委托event delegate實(shí)例簡(jiǎn)述

    C#事件處理和委托event delegate實(shí)例簡(jiǎn)述

    這篇文章主要介紹了C#事件處理和委托event delegate的簡(jiǎn)單實(shí)例,較為詳細(xì)的講述了C#事件處理和委托的聲明與實(shí)現(xiàn)過(guò)程,代碼簡(jiǎn)單易懂,需要的朋友可以參考下
    2014-09-09
  • 獲取wince mac地址與IP地址解決方案

    獲取wince mac地址與IP地址解決方案

    由于需要進(jìn)行身份的驗(yàn)證,需要獲取移動(dòng)終端的MAC地址,于是在網(wǎng)上進(jìn)行搜索整理一番,現(xiàn)在將實(shí)現(xiàn)獲取MAC地址的方法與大家共享
    2012-12-12
  • 聊聊Unity自定義組件之序列幀播放組件問(wèn)題

    聊聊Unity自定義組件之序列幀播放組件問(wèn)題

    由于最近的項(xiàng)目中需要用到大量的序列幀動(dòng)畫以及邏輯處理,本來(lái)想用Unity自帶的Animation組件來(lái)實(shí)現(xiàn)的,但由于甲方需求一再變更,需要處理的邏輯太多,為了方便修改和拓展,所以就根據(jù)自己項(xiàng)目的需求自定義了一個(gè)序列幀播放組件來(lái)輔助開發(fā)
    2022-01-01
  • C#基礎(chǔ)知識(shí)系列八const和readonly關(guān)鍵字詳細(xì)介紹

    C#基礎(chǔ)知識(shí)系列八const和readonly關(guān)鍵字詳細(xì)介紹

    這篇文章主要介紹了C#中的const和readonly關(guān)鍵字,有需要的朋友可以參考一下
    2014-01-01
  • WPF通過(guò)使用C#代碼給控件賦值

    WPF通過(guò)使用C#代碼給控件賦值

    開發(fā)中偶爾會(huì)用到使用c#代碼給控件賦值,這里需要通過(guò)F12找到控件的賦值類型,然后在看控件可以使用那種方式賦值,花點(diǎn)時(shí)間研究一下,基本都可以通過(guò)c#代碼給控件賦值的,需要的朋友可以參考下
    2023-09-09
  • C# 位圖BitArray的使用

    C# 位圖BitArray的使用

    如果我們著重處理一個(gè)以位為單位的數(shù)據(jù)時(shí),就可以考慮使用位數(shù)組。本文就介紹了C# 位圖BitArray的使用,感興趣的可以了解一下
    2021-06-06
  • C#迭代器方法介紹

    C#迭代器方法介紹

    這篇文章主要介紹了C#迭代器方法,可以使用foreach循環(huán)語(yǔ)句進(jìn)行的迭代的方法,稱為可迭代方法,或者迭代器方法,方法操作,想了解更多內(nèi)容得小伙伴可以學(xué)習(xí)下面文章內(nèi)容,希望給你的學(xué)習(xí)帶來(lái)幫助
    2022-03-03
  • C#筆試題之同線程Lock語(yǔ)句遞歸不會(huì)死鎖

    C#筆試題之同線程Lock語(yǔ)句遞歸不會(huì)死鎖

    這篇文章主要介紹了C$ 筆試題之同線程Lock語(yǔ)句遞歸不會(huì)死鎖,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • c#判斷代碼是否執(zhí)行超時(shí)的幾種方式總結(jié)

    c#判斷代碼是否執(zhí)行超時(shí)的幾種方式總結(jié)

    這篇文章主要介紹了c#判斷代碼是否執(zhí)行超時(shí)的幾種方式總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • C#實(shí)現(xiàn)設(shè)置Excel表格中文本對(duì)齊方式和格式

    C#實(shí)現(xiàn)設(shè)置Excel表格中文本對(duì)齊方式和格式

    這篇文章主要為大家詳細(xì)介紹了如何在.NET 程序中通過(guò)C# 設(shè)置Excel單元格中文本的對(duì)齊方式,方向以及換行,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-04-04

最新評(píng)論

吉木乃县| 阿拉善左旗| 延津县| 藁城市| 赤峰市| 邮箱| 襄汾县| 扎兰屯市| 色达县| 仁寿县| 鱼台县| 辰溪县| 莱阳市| 竹北市| 宝兴县| 牡丹江市| 都昌县| 房山区| 湘潭市| 卓尼县| 蒙城县| 澄城县| 乐清市| 衡阳县| 许昌县| 象州县| 新乡市| 略阳县| 甘肃省| 绿春县| 葵青区| 德庆县| 新密市| 根河市| 会泽县| 罗田县| 香河县| 榆树市| 蒲城县| 莱阳市| 盘锦市|