1

我有一组不同形状和大小的各种物体的图像。它们上面设置了透明背景,但图像的整个尺寸是正方形。我想计算一个包含图像中对象的坐标框(左上 x/y,右下 x/y),同时尽可能多地忽略透明背景。我需要在代码中即时执行此操作。

是否有可用于 C# 的示例或库允许我执行此操作?我在一个网站中使用这些,其中几个对象动态叠加到一个图像中,我想计算一个图像映射,其中包含合并图像中每个对象的坐标。使用方形图像的完整尺寸会在坐标集中创建巨大的重叠,并且通常最后一个坐标会隐藏较低的对象,使其无法点击。

4

1 回答 1

1

好吧,使用System.Drawing.Bitmap它并不太难(以下肯定不是最高效的方式):

// we will store actual bounds in here
int left, right, top, bottom;

using (Bitmap b = ...) // open image here
{
    var pixelsX = Enumerable.Range(0, b.Width);
    var pixelsY = Enumerable.Range(0, b.Height);

    left   = pixelsX.FirstOrDefault(
                x => pixelsY.Any(y => b.GetPixel(x, y).A != 0));
    right  = pixelsX.Reverse().FirstOrDefault(
                x => pixelsY.Any(y => b.GetPixel(x, y).A != 0));

    top    = pixelsY.FirstOrDefault(
                y => pixelsX.Any(x => b.GetPixel(x, y).A != 0));
    bottom = pixelsY.Reverse().FirstOrDefault(
                y => pixelsX.Any(x => b.GetPixel(x, y).A != 0));
}

请注意,所有这 4 个坐标都是“包含”边界(意思是:它们所代表的像素的行/列确实包含至少一个不透明像素),所以如果你应该计算width并且height你的新边界是这样的:

int width = right - left + 1;
int height = bottom - top + 1;

顺便说一句,对于一个完全透明的图像,所有 4 个坐标都应该是0,因此width两者height都是1- 我想这对你来说不是问题。

于 2013-10-04T22:40:36.770 回答