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);
}
}
}
}