在C#中裁剪图像白色空间

我有请求在C#中裁剪图像空白区域,我从论坛搜索一些方法,但它无法满足我的要求。

有原始图像,

在此处输入图像描述

这是我期望的结果,

在此处输入图像描述

任何帮助都很感激。

您可以尝试获取第一个图像数据(有图像),并将数据绘制到新图像中。 试试这个方法。 希望它可以帮到你。

private static Bitmap ImageTrim(Bitmap img) { //get image data BitmapData bd= img.LockBits(new Rectangle(Point.Empty, img.Size), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); int[] rgbValues = new int[img.Height * img.Width]; Marshal.Copy(bd.Scan0, rgbValues, 0, rgbValues.Length); img.UnlockBits(bd); #region determine bounds int left = bd.Width; int top = bd.Height; int right = 0; int bottom = 0; //determine top for (int i = 0; i < rgbValues.Length; i++) { int color = rgbValues[i] & 0xffffff; if (color != 0xffffff) { int r = i / bd.Width; int c = i % bd.Width; if (left > c) { left = c; } if (right < c) { right = c; } bottom = r; top = r; break; } } //determine bottom for (int i = rgbValues.Length - 1; i >= 0; i--) { int color = rgbValues[i] & 0xffffff; if (color != 0xffffff) { int r = i / bd.Width; int c = i % bd.Width; if (left > c) { left = c; } if (right < c) { right = c; } bottom = r; break; } } if (bottom > top) { for (int r = top + 1; r < bottom; r++) { //determine left for (int c = 0; c < left; c++) { int color = rgbValues[r * bd.Width + c] & 0xffffff; if (color != 0xffffff) { if (left > c) { left = c; break; } } } //determine right for (int c = bd.Width - 1; c > right; c--) { int color = rgbValues[r * bd.Width + c] & 0xffffff; if (color != 0xffffff) { if (right < c) { right = c; break; } } } } } int width = right - left + 1; int height = bottom - top + 1; #endregion //copy image data int[] imgData = new int[width * height]; for (int r = top; r <= bottom; r++) { Array.Copy(rgbValues, r * bd.Width + left, imgData, (r - top) * width, width); } //create new image Bitmap newImage = new Bitmap(width, height, PixelFormat.Format32bppArgb); BitmapData nbd = newImage.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); Marshal.Copy(imgData, 0, nbd.Scan0, imgData.Length); newImage.UnlockBits(nbd); return newImage; } 

如果您的图像只有2种颜色(白色和黑色),您可以遍历图像并找到左上角的像素集和右下角的像素集,然后您可以裁剪它:(伪代码,取决于您使用的是什么你的图像像素)

 int minX = int.MaxValue, maxX = 0, minY = int.MaxValue, maxY = 0; for (x = 0; x < image.Width, x++) { for (y = 0; y < image.Height; y++) { if (image[x, y] == 1) { if (x < minX) minX = x; else if (x > maxX) maxX = x; if (y < minY) minY = y; else if (y > maxY) maxY = y; } } } 

那么你将拥有可以裁剪图像的坐标

我确信这可以优化,但这是一般的想法