c# 图片自动去黑边思路
1、如果某一行(列)的所有像素点的颜色相差不大,则判断为黑边/白边
2、按照1方法依次去除上、下、左、右黑边/白边
public Bitmap CropBitmap(Bitmap originalBitmap, int top, int bottom, int left, int right)
        {
            // 计算新的图像大小
            int newWidth = originalBitmap.Width - left - right;
            int newHeight = originalBitmap.Height - top - bottom;
            // 创建新的 Bitmap 对象
            Bitmap croppedBitmap = new Bitmap(newWidth, newHeight);
            // 创建一个 Graphics 对象,用于绘制新的图像
            Graphics g = Graphics.FromImage(croppedBitmap);
            // 绘制原始图像的一部分到新的图像中
            g.DrawImage(originalBitmap, new Rectangle(0, 0, newWidth, newHeight), new Rectangle(left, top, newWidth, newHeight), GraphicsUnit.Pixel);
            // 释放 Graphics 对象
            g.Dispose();
            // 返回裁剪后的图像
            return croppedBitmap;
        }
        //去除上黑边
        private Bitmap RemoveUpBlackEdge(Bitmap image)
        {
            int height = image.Height;
            int width = image.Width;
            Color firstPixel = image.GetPixel(0, 0); // 获取左上角第一个像素的颜色
            int diffLine = 0; // 顶部黑边行数
            for (int y = 0; y < height; y++) // 从第一行开始比较
            {
                bool darkLine = true;
                for (int x = 0; x < width; x++)
                {
                    Color pixel = image.GetPixel(x, y);
                    int deltaR = Math.Abs(pixel.R - firstPixel.R);
                    int deltaG = Math.Abs(pixel.G - firstPixel.G);
                    int deltaB = Math.Abs(pixel.B - firstPixel.B);
                    int deltaTotal = deltaR + deltaG + deltaB;
                    if (deltaTotal > 500 || deltaTotal < -500)
                    {
                        darkLine = false;
                        break;
                    }
                    
                }
                diffLine++;
                if (!darkLine) // 如果这一行和第一行不同,记录下这一行的行数
                {
                    break;
                }
            }
            return CropBitmap(image, diffLine, 0, 0, 0);
        }
        //去除下黑边
        private Bitmap RemoveDownBlackEdge(Bitmap image)
        {
            int height = image.Height;
            int width = image.Width;
            Color firstPixel = image.GetPixel(0, height-1); // 获取左下角第一个像素的颜色
            int diffLine = 0; // 底部黑边行数
            for (int y = height - 1; y > 1; y--) // 从最后一行开始比较
            {
                bool darkLine = true;
                for (int x = 0; x < width; x++)
                {
                    Color pixel = image.GetPixel(x, y);
                    int deltaR = Math.Abs(pixel.R - firstPixel.R);
                    int deltaG = Math.Abs(pixel.G - firstPixel.G);
                    int deltaB = Math.Abs(pixel.B - firstPixel.B);
                    int deltaTotal = deltaR + deltaG + deltaB;
                    if (deltaTotal > 500 || deltaTotal < -500)
                    {
                        darkLine = false;
                        break;
                    }
                }
                diffLine++;
                if (!darkLine) // 如果这一行和第一行不同,记录下这一行的行数
                {
                    break;
                }
            }
            if (diffLine == 0) // 如果所有行都相同
            {
                return image;
            }
            else // 如果有不同的行
            {
                return CropBitmap(image, 0, diffLine, 0, 0);
            }
        }
        private Bitmap RemoveLeftBlackEdge(Bitmap image)
        {
            int height = image.Height;
            int width = image.Width;
            Color firstPixel = image.GetPixel(0, 0); // 获取第一个像素的颜色
            int diffLine = 0; // 顶部黑边行数
            for (int x = 0; x < width; x++) // 从第一行开始比较
            {
                bool darkLine = true;
                for (int y = 0; y < height; y++)
                {
                    Color pixel = image.GetPixel(x, y);
                    //MessageBox.Show(pixel.ToArgb().ToString());
                    int deltaR = Math.Abs(pixel.R - firstPixel.R);
                    int deltaG = Math.Abs(pixel.G - firstPixel.G);
                    int deltaB = Math.Abs(pixel.B - firstPixel.B);
                    int deltaTotal = deltaR + deltaG + deltaB;
                    if (deltaTotal > 500 || deltaTotal < -500)
                    {
                        darkLine = false;
                        break;
                    }
                }
                diffLine++;
                if (!darkLine) // 如果这一行和第一行不同,记录下这一行的行数
                {
                    break;
                }
            }
            if (diffLine == 0) // 如果所有行都相同
            {
                return image;
            }
            else // 如果有不同的行
            {
                return CropBitmap(image, 0, 0, diffLine, 0);
            }
        }
        // 去除右边黑边
        private Bitmap RemoveRightBlackEdge(Bitmap image)
        {
            int height = image.Height;
            int width = image.Width;
            Color firstPixel = image.GetPixel(width - 1, 0); // 获取右上角第一个像素的颜色
            int diffLine = 0; // 右边黑边列数
            for (int x = width - 1; x > 0; x--) // 从右边第一列开始比较
            {
                bool darkLine = true;
                for (int y = 0; y < height; y++)
                {
                    Color pixel = image.GetPixel(x, y);
                    //MessageBox.Show(pixel.ToArgb().ToString());
                    int deltaR = Math.Abs(pixel.R - firstPixel.R);
                    int deltaG = Math.Abs(pixel.G - firstPixel.G);
                    int deltaB = Math.Abs(pixel.B - firstPixel.B);
                    int deltaTotal = deltaR + deltaG + deltaB;
                    if (deltaTotal > 500 || deltaTotal < -500)
                    {
                        //MessageBox.Show(pixel.ToArgb().ToString() + firstPixel.ToArgb().ToString());
                        darkLine = false;
                        break;
                    }
                }
                diffLine++;
                if (!darkLine) // 如果这一列和第一列不同,记录下这一列的序号
                {
                    break;
                }
            }
            if (diffLine == 0) // 如果所有行都相同
            {
                return image;
            }
            else // 如果有不同的行
            {
                return CropBitmap(image, 0, 0, 0, diffLine);
            }
        }
}
                
            
        
浙公网安备 33010602011771号