網(wǎng)站首頁 編程語言 正文
一、效果展示
二、隨機生成熱力點
熱力點類
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); } // 創(chuàng)建新的顏色混合來告訴 PathGradientBrush 使用什么顏色以及放置它們的位置 ColorBlend colorBlend = new ColorBlend(3); // 計算比例以將字節(jié)強度范圍從 0-255 縮放到 0-1 float fRatio = 1F / Byte.MaxValue; // 預計算字節(jié)最大值的一半 byte bHalf = Byte.MaxValue / 2; // 將其中心值的強度從低高翻轉(zhuǎn)到高低 int iIntensity = (byte)(HeatPoint.Intensity - ((HeatPoint.Intensity - bHalf) * 2)); // 存儲縮放和翻轉(zhuǎn)的強度值以用于梯度中心位置 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 以使用圓周點創(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)建一組顏色映射以將我們的灰度蒙版重新映射為全色 // 接受一個 alpha 字節(jié)來指定輸出圖像的透明度 ColorMap[] Colors = CreatePaletteIndex(Alpha); // 創(chuàng)建新的圖像屬性類來處理顏色重新映射 // 注入我們的顏色映射數(shù)組來指示圖像屬性類如何進行著色 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; }
五、源碼下載
原文鏈接:https://blog.csdn.net/kangweijian/article/details/121846832
相關(guān)推薦
- 2022-04-17 使用css漸變色。實現(xiàn)動態(tài)進度條效果
- 2024-02-29 UNI-APP項目在引用官方提供的Uni-App-Demo實例中的組件時應該注意的問題
- 2022-01-12 cesium polygon添加邊界線不起作用
- 2022-07-13 【arthas】使用arthas定位接口耗時問題、無日志情況下排查問題
- 2022-01-25 項目啟動的時候報Exception in thread main 錯誤解決方法
- 2021-12-02 docker容器時區(qū)錯誤問題_docker
- 2022-09-24 python基于numpy的線性回歸_python
- 2022-10-30 使用AVFoundation實現(xiàn)視頻錄制詳解_IOS
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支