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