c# 自动裁剪图像

Posted

技术标签:

【中文标题】c# 自动裁剪图像【英文标题】:c# auto-crop an image 【发布时间】:2011-08-11 20:22:15 【问题描述】:

我有一个黑白的System.Drawing.Bitmap 我需要自动裁剪它,以便它只有适合图像所需的大小。此图像始终从左上角 (0,0) 位置开始,但我不确定需要多少高度和宽度。有什么方法可以自动裁剪到大小?

【问题讨论】:

图片的空白区域包含什么?白色或透明像素? Ummm...我不知道它是否非常有效,但我会搜索最后一行全白的像素(或从最后一行开始)并得到它的数字。列相同。 【参考方案1】:

以下是我使用的代码:

    // Figure out the final size
    int maxX = 0;
    int maxY = 0;
    for (int x = 0; x < bitmap.Width; x++)
    
        for (int y = 0; y < bitmap.Height; y++)
        
            System.Drawing.Color c = bitmap.GetPixel(x, y);
            System.Drawing.Color w = System.Drawing.Color.White;
            if (c.R != w.R || c.G != w.G || c.B != w.B)
            
                if (x > maxX)
                    maxX = x;
                if (y > maxY)
                    maxY = y;
            
        
    
    maxX += 2;

【讨论】:

我不知道您的图像上的任何数据,但感觉您可以通过平分图像来加快速度,检查是否有任何非白色值会告诉您要平分哪一半...等等。您可能能够实现 O((log h)*(log w)) 最坏情况时间而不是 O(w*h)。 我猜这适用于闭合形状,但可能不适用于仅包含两个非空白像素的图像。哦,好吧,根据图像值得考虑。【参考方案2】:

如果您的图像不像我的那样从 0,0 开始,这里有一个变体可以让您获得自动裁剪范围:

public static Rectangle GetAutoCropBounds(Bitmap bitmap)

    int maxX = 0;
    int maxY = 0;

    int minX = bitmap.Width;
    int minY = bitmap.Height;

    for (int x = 0; x < bitmap.Width; x++)
    
        for (int y = 0; y < bitmap.Height; y++)
        
            var c = bitmap.GetPixel(x, y);
            var w = Color.White;
            if (c.R != w.R || c.G != w.G || c.B != w.B)
            
                if (x > maxX)
                    maxX = x;
                if (x < minX)
                    minX = x;
                if (y > maxY)
                    maxY = y;
                if (y < minY)
                    minY = y;
            
        
    

    maxX += 2;

    return new Rectangle(minX, minY, maxX - minX, maxY - minY);

注意:如果您要处理任意数量的大量图像或高分辨率图像,那么您需要寻找比GetPixel 方法更快的替代方法。

【讨论】:

以上是关于c# 自动裁剪图像的主要内容,如果未能解决你的问题,请参考以下文章

从两点裁剪图像(C#)

如何使用 C# 裁剪图像?

C#裁剪图像返回错误的坐标

C#:同时调整图像大小和裁剪

C# 使用 Emgu 按像素颜色裁剪图像

C#裁剪图像中的透明部分