剪切透明部分图像

时间:2015-08-11 14:59:16

标签: c# image-processing crop

更新的图片:enter image description here

非常感谢你,但是我想做一些与众不同的事情,在这里将每个矩形切割成一个sperate图像。让我们先尝试找到蓝色块边界。听起来很难,但实际上很简单。

看看我到目前为止做了什么:

  private unsafe Bitmap CodeImage(Bitmap bmp)
    {

        Bitmap bmpRes = new Bitmap(bmp.Width, bmp.Height);

        BitmapData bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat);


        IntPtr scan0 = bmData.Scan0;


        int stride = bmData.Stride;


        int nWidth = bmp.Width;
        int nHeight = bmp.Height;
        int minX = 10000 ;
        int maxX = -10000;
        int minY = 10000;
        var maxY = -10000;

        bool found = false;
        for (int y = 0; y < nHeight; y++)
        {
            byte* p = (byte*)scan0.ToPointer();
            p += y * stride;


            for (int x = 0; x < nWidth; x++)
            {




                if (p[3]!=0)  //Check if pixel is transpert;
                {


                    found = true;
                  if (x < minX)
                      minX = x;
                  if (y < minY)
                      minY = y;
                   if (x > maxX)
                      maxX = x;
                  if (y > maxY)
                      maxY = y;

                }

                else
                {
                    if (found)
                    {


                        Rectangle temp = new Rectangle(minX, minY, maxX - minX,  maxY-minY);


                        return bmp.Clone(temp, bmp.PixelFormat);
                    }
                }



                p += 4;


            }
        }


        return null;

    }

你实际上是在写,我应该像这样计算宽度: int width = maxX - minX;它实际上有效..但高度为0 ....

尝试这个男人输出几乎正确的矩形与这些边界: (高度为200,800,400, 0 )。 我只是在我的算法中使用了你的部分代码而且你是对的,但是现在高度有点问题我会非常感激,如果你看看

1 个答案:

答案 0 :(得分:0)

我会用伪ish代码写这个,因为你应该可以将它应用于任何类型的图像或语言......

var minX = 10000
var maxX = -10000
var minY = 10000
var maxY = -10000

for (var y = 0 to height)
{
    for (var x = 0 to width)
    {
        if (pixel(x,y).Color != transparent)
        {
            if (x < minX) minX = x
            if (y < minY) minY = y
            if (x > maxX) maxX = x
            if (y > maxY) maxY = y
        }
    }
}

var cropRectangle = (minX, minY, maxX, maxY)

您现在可以在位图上使用标准函数来获取该区域,该区域应该是由非透明像素限定的区域。