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);
            }
        }
}
posted @ 2023-09-26 10:11  sherlock-merlin  阅读(183)  评论(0编辑  收藏  举报