【问题标题】:Cut transparent parts image切割透明零件图像
【发布时间】:2015-11-03 21:18:09
【问题描述】:

更新后的图片:

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

看看我到目前为止什么时候做的:

  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)。 我只是在我的算法中使用了你的部分代码,是的,你是对的,但现在高度有点问题,如果你能看一下,我将非常感激

【问题讨论】:

  • 起点(矩形的左上角)是任何不透明像素的 Min(x,y)。末端(矩形的右下角)是任何不透明像素的 Max(x,y)。从那里应该很容易。

标签: c# image-processing crop


【解决方案1】:

我将用伪代码编写此代码,因为您应该能够将其应用于任何类型的图像或语言...

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)

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

【讨论】:

  • 首先非常感谢您的帮助!我很感激!我尝试了您的建议,您可以在问题本身上看到更新的代码,但代码逻辑中可能有什么问题?因为当我尝试从更改的矩形克隆时,我得到的图像仍然相同......你可以再看看吗?谢谢! @Ron Beyer
  • 只有当所有 4 个 RGBA 值都为 0 时,像素才一定是透明的,您应该只检查“a”通道是否为 0。此外,您始终检查相同的像素(永远不要添加到设置了p 的指针,因此您只检查该数组的前4个元素。您需要将0,1,2,3偏移X值以获得当前像素。
  • 您是否尝试在第一个已知像素处为 X 和 Y 设置断点以查看您是否正在检查正确的值?也许 A 是 1 而不是 0?
  • 使用了这个 `MessageBox.Show(x.ToString() + "," + y.ToString());` 打印了 0,0。 @RonBeyer
  • 打印 X 和 Y,但如果您知道(通过使用绘画或其他方式)矩形的顶角为 1500,1200,则为循环设置断点,条件为 X = = 1500 && Y == 1200 然后看p[3]的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-31
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
相关资源
最近更新 更多