using System; using System.IO; namespace AutoFocusTool { /// /// 自检用轻量图像诊断(不依赖 WPF)。 /// 统计像素亮度,判断是全黑/全白/有图;裸写 24bpp BMP 存盘供肉眼确认。 /// internal static class Diag { /// 返回 (最小, 最大, 平均) 灰度。 public static (int min, int max, double mean) Stats(byte[] bgr24) { int min = 255, max = 0; long sum = 0; // 每3字节取灰度,步进采样(每隔9像素)加速 int n = 0; for (int i = 0; i + 2 < bgr24.Length; i += 27) { int g = (bgr24[i] * 29 + bgr24[i + 1] * 150 + bgr24[i + 2] * 77) >> 8; if (g < min) min = g; if (g > max) max = g; sum += g; n++; } return (min, max, n > 0 ? (double)sum / n : 0); } /// 裸写 24bpp BMP(含 FlipY 翻正)。 public static void SaveBmp(byte[] bgr24, int w, int h, string path) { int rowSize = ((w * 3 + 3) / 4) * 4; // 4字节对齐 int imgSize = rowSize * h; int fileSize = 54 + imgSize; using var fs = new FileStream(path, FileMode.Create); using var bw = new BinaryWriter(fs); // BMP 文件头 14 bw.Write((byte)'B'); bw.Write((byte)'M'); bw.Write(fileSize); bw.Write(0); bw.Write(54); // DIB 头 40 bw.Write(40); bw.Write(w); bw.Write(h); // h>0 → 自底向上,正好翻正相机的倒像 bw.Write((short)1); bw.Write((short)24); bw.Write(0); bw.Write(imgSize); bw.Write(2835); bw.Write(2835); bw.Write(0); bw.Write(0); // 像素:BMP 自底向上存,相机数据是倒的,直接顺序写即翻正 byte[] pad = new byte[rowSize - w * 3]; for (int y = 0; y < h; y++) { int row = y * w * 3; bw.Write(bgr24, row, w * 3); if (pad.Length > 0) bw.Write(pad); } } } }