| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- using System;
- using System.IO;
- namespace AutoFocusTool
- {
- /// <summary>
- /// 自检用轻量图像诊断(不依赖 WPF)。
- /// 统计像素亮度,判断是全黑/全白/有图;裸写 24bpp BMP 存盘供肉眼确认。
- /// </summary>
- internal static class Diag
- {
- /// <summary>返回 (最小, 最大, 平均) 灰度。</summary>
- 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);
- }
- /// <summary>裸写 24bpp BMP(含 FlipY 翻正)。</summary>
- 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);
- }
- }
- }
- }
|