如何用透明背景确定图像中的实际物体角点

时间:2013-10-04 19:56:45

标签: c# html imagemap

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

是否有可用于C#的示例或库可以让我这样做?我在一个网站中使用这些,其中几个对象动态地叠加到单个图像中,我想计算一个图像地图,其中包含合并图像中每个对象的坐标。使用方形图像的完整大小会在坐标集中产生巨大的重叠,并且通常坐标中的最后一个会隐藏下方对象的可点击性。

1 个答案:

答案 0 :(得分: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个坐标都是“包含”边界(意思是:它们所代表的像素的行/列确实包含至少一个非透明像素),所以如果你应该计算{{你的新界限的1}}和width就像这样:

height

顺便说一下,对于一个完全透明的图像,所有4个坐标都应该是int width = right - left + 1; int height = bottom - top + 1; ,结果0width都是height - 我猜这个对你来说不是问题。