namespace Automata.Screen; using System.Drawing; using System.Drawing.Imaging; using System.Runtime.InteropServices; using SdImageFormat = System.Drawing.Imaging.ImageFormat; static class ImageUtils { public static (byte[] gray, byte[] argb, int stride) BitmapToGrayAndArgb(Bitmap bmp) { int w = bmp.Width, h = bmp.Height; var data = bmp.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); byte[] argb = new byte[data.Stride * h]; Marshal.Copy(data.Scan0, argb, 0, argb.Length); bmp.UnlockBits(data); int stride = data.Stride; byte[] gray = new byte[w * h]; for (int y = 0; y < h; y++) for (int x = 0; x < w; x++) { int i = y * stride + x * 4; gray[y * w + x] = (byte)((argb[i] + argb[i + 1] + argb[i + 2]) / 3); } return (gray, argb, stride); } public static SdImageFormat GetImageFormat(string path) { var ext = Path.GetExtension(path).ToLowerInvariant(); return ext switch { ".jpg" or ".jpeg" => SdImageFormat.Jpeg, ".bmp" => SdImageFormat.Bmp, _ => SdImageFormat.Png, }; } }