Loading... 昨天发了一个二值化的工具类 , 跑起来才发现不兼容8位图片什么的 反正有问题 重新写了个工具类 ```csharp using System; using System.Drawing; using System.Drawing.Imaging; public static Bitmap ConvertToGrayscale(Bitmap image) { // 创建一个新的位图对象,将图像转换为 8 位灰度图像 Bitmap grayscaleImage = new Bitmap(image.Width, image.Height, PixelFormat.Format8bppIndexed); // 设置调色板 ColorPalette grayscalePalette = grayscaleImage.Palette; for (int i = 0; i < grayscalePalette.Entries.Length; i++) { grayscalePalette.Entries[i] = Color.FromArgb(i, i, i); } grayscaleImage.Palette = grayscalePalette; // 将图像锁定到内存中 Rectangle rect = new Rectangle(0, 0, image.Width, image.Height); BitmapData imageData = image.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); BitmapData grayscaleData = grayscaleImage.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed); // 获取每个像素的字节数 int pixelSize = 3; // 24 bpp // 获取位图数据的指针 IntPtr imageScan0 = imageData.Scan0; IntPtr grayscaleScan0 = grayscaleData.Scan0; // 定义图像行字节数 int imageStride = imageData.Stride; int grayscaleStride = grayscaleData.Stride; // 定义图像高度和宽度 int imageHeight = image.Height; int imageWidth = image.Width; // 定义字节数组存储行数据 byte[] imageRow = new byte[imageStride]; byte[] grayscaleRow = new byte[grayscaleStride]; // 循环遍历每个像素进行灰度转换 for (int y = 0; y < imageHeight; y++) { // 拷贝当前行数据到字节数组 System.Runtime.InteropServices.Marshal.Copy(imageScan0 + y * imageStride, imageRow, 0, imageStride); for (int x = 0; x < imageWidth; x++) { // 获取当前像素的颜色分量 byte blue = imageRow[x * pixelSize]; byte green = imageRow[x * pixelSize + 1]; byte red = imageRow[x * pixelSize + 2]; // 计算灰度值 byte gray = (byte)(0.2125 * red + 0.7154 * green + 0.0721 * blue); // 将灰度值赋值给转换后的像素 grayscaleRow[x] = gray; } // 将转换后的行数据拷贝回位图 System.Runtime.InteropServices.Marshal.Copy(grayscaleRow, 0, grayscaleScan0 + y * grayscaleStride, grayscaleStride); } // 解锁图像 image.UnlockBits(imageData); grayscaleImage.UnlockBits(grayscaleData); return grayscaleImage; } ``` 原图  二值化  最后修改:2023 年 06 月 15 日 © 允许规范转载 打赏 赞赏作者 微信 赞 1 如果觉得我的文章对你有用,请随意赞赏