按颜色生成直方图通道时重复保存蓝色通道的问题排查
视频帧颜色通道直方图截图问题修复
问题1:所有通道截图均为蓝色通道内容
原因
当前代码处理单帧时,将灰度、红、绿、蓝四个直方图依次绘制到同一个zedGraphControl1的GraphPane中,最后绘制的蓝色通道会覆盖之前的所有内容。调用SaveGraphScreenshots时直接对该控件截图,导致所有通道的截图文件都只显示最后绘制的蓝色通道直方图。
修复方案
修改SaveGraphScreenshots方法,针对每个需要保存的通道,单独清空GraphPane、仅绘制对应通道的直方图,完成截图后再恢复原有绘制内容。
问题2:未实现仅保存有数据的颜色通道截图
原因
当前使用redHistogram.Any()判断通道是否有数据,但int类型的直方图数组初始化时包含256个0值,Any()方法只要数组非空就返回true,无法识别通道是否有实际像素数据(即直方图计数是否存在非零值)。
修复方案
替换判断逻辑,检查直方图数组中是否存在大于0的元素,以此确定是否需要保存该通道的截图。
修改后的完整代码
修复后的SaveGraphScreenshots方法
private void SaveGraphScreenshots(string frameFolderPath, int[] redHistogram, int[] greenHistogram, int[] blueHistogram) { // 保存原始曲线和标题,用于后续恢复界面显示 var originalCurves = zedGraphControl1.GraphPane.CurveList.ToList(); var originalTitle = zedGraphControl1.GraphPane.Title.Text; try { // 处理蓝色通道截图(仅当有数据时) if (blueHistogram.Any(count => count > 0)) { zedGraphControl1.GraphPane.CurveList.Clear(); PlotHistogram(blueHistogram, "Blue Channel Histogram", "Pixel Value", "Frequency", zedGraphControl1.GraphPane, Color.Blue); zedGraphControl1.AxisChange(); zedGraphControl1.Refresh(); string blueGraphFilePath = Path.Combine(frameFolderPath, "BlueHistogramGraph.png"); SaveGraphScreenshot(zedGraphControl1, blueGraphFilePath); } // 处理红色通道截图(仅当有数据时) if (redHistogram.Any(count => count > 0)) { zedGraphControl1.GraphPane.CurveList.Clear(); PlotHistogram(redHistogram, "Red Channel Histogram", "Pixel Value", "Frequency", zedGraphControl1.GraphPane, Color.Red); zedGraphControl1.AxisChange(); zedGraphControl1.Refresh(); string redGraphFilePath = Path.Combine(frameFolderPath, "RedHistogramGraph.png"); SaveGraphScreenshot(zedGraphControl1, redGraphFilePath); } // 处理绿色通道截图(仅当有数据时) if (greenHistogram.Any(count => count > 0)) { zedGraphControl1.GraphPane.CurveList.Clear(); PlotHistogram(greenHistogram, "Green Channel Histogram", "Pixel Value", "Frequency", zedGraphControl1.GraphPane, Color.Green); zedGraphControl1.AxisChange(); zedGraphControl1.Refresh(); string greenGraphFilePath = Path.Combine(frameFolderPath, "GreenHistogramGraph.png"); SaveGraphScreenshot(zedGraphControl1, greenGraphFilePath); } } finally { // 恢复界面原始的直方图显示 zedGraphControl1.GraphPane.CurveList.Clear(); zedGraphControl1.GraphPane.CurveList.AddRange(originalCurves.ToArray()); zedGraphControl1.GraphPane.Title.Text = originalTitle; zedGraphControl1.AxisChange(); zedGraphControl1.Refresh(); } }
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

