diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs b/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs index a89a6ad..2748bc2 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs @@ -4,8 +4,10 @@ using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; +using System.Drawing.Imaging; using System.IO; using System.Linq; +using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; @@ -617,14 +619,22 @@ namespace JoyD.Windows.CS using (ColorDialog colorDialog = new ColorDialog()) { // 设置初始颜色为当前行的颜色 - colorDialog.Color = (Color)tempDiffData[e.RowIndex]["color"]; + Color oldColor = (Color)tempDiffData[e.RowIndex]["color"]; + colorDialog.Color = oldColor; if (colorDialog.ShowDialog() == DialogResult.OK) { + Color newColor = colorDialog.Color; // 更新颜色数据 - tempDiffData[e.RowIndex]["color"] = colorDialog.Color; + tempDiffData[e.RowIndex]["color"] = newColor; // 刷新单元格以显示新颜色 dataGridViewTempDiff.Refresh(); + + // 更新温差层图像中所有原颜色的像素为新颜色 + if (_tempDiffOverlayImage != null) + { + UpdateTempDiffOverlayPixelsColor(oldColor, newColor); + } } } } @@ -2588,6 +2598,74 @@ namespace JoyD.Windows.CS } } + /// + /// 更新温差层图像中指定颜色的所有像素 + /// 将旧颜色的像素替换为新颜色 + /// + /// 需要替换的旧颜色 + /// 替换后的新颜色 + private void UpdateTempDiffOverlayPixelsColor(Color oldColor, Color newColor) + { + if (_tempDiffOverlayImage == null || !( _tempDiffOverlayImage is Bitmap)) + return; + + Bitmap bitmap = (Bitmap)_tempDiffOverlayImage; + + // 锁定位图以提高性能 + BitmapData bitmapData = bitmap.LockBits( + new Rectangle(0, 0, bitmap.Width, bitmap.Height), + ImageLockMode.ReadWrite, + PixelFormat.Format32bppArgb); + + try + { + int bytesPerPixel = 4; // 32bppArgb格式每像素4字节 + int byteCount = bitmapData.Stride * bitmapData.Height; + byte[] pixels = new byte[byteCount]; + + // 将图像数据复制到数组 + Marshal.Copy(bitmapData.Scan0, pixels, 0, byteCount); + + // 转换颜色为ARGB字节数组以便比较 + byte oldA = oldColor.A; + byte oldR = oldColor.R; + byte oldG = oldColor.G; + byte oldB = oldColor.B; + + byte newA = newColor.A; + byte newR = newColor.R; + byte newG = newColor.G; + byte newB = newColor.B; + + // 遍历所有像素并替换颜色 + for (int i = 0; i < byteCount; i += bytesPerPixel) + { + // ARGB格式:从低位到高位是B, G, R, A + if (pixels[i] == oldB && pixels[i + 1] == oldG && pixels[i + 2] == oldR && pixels[i + 3] == oldA) + { + pixels[i] = newB; // B + pixels[i + 1] = newG; // G + pixels[i + 2] = newR; // R + pixels[i + 3] = newA; // A + } + } + + // 将修改后的数据复制回位图 + Marshal.Copy(pixels, 0, bitmapData.Scan0, byteCount); + } + catch (Exception ex) + { + Console.WriteLine("更新温差层像素颜色失败: " + ex.Message); + } + finally + { + // 解锁位图 + bitmap.UnlockBits(bitmapData); + // 刷新图像显示 + picBoxTemp.Invalidate(); + } + } + /// /// 当图像更新或控件大小变化时,重新创建叠加层图像 /// 确保矩形框正确显示在新的尺寸下