我有一组不同形状和大小的各种物体的图像。它们具有透明背景,但图像的整个尺寸为正方形。我想计算一个坐标框(左上角x / y,右下角x / y),它包含图像中的对象,同时忽略尽可能多的透明背景。我需要在代码中动态执行此操作。
是否有可用于C#的示例或库可以让我这样做?我在一个网站中使用这些,其中几个对象动态地叠加到单个图像中,我想计算一个图像地图,其中包含合并图像中每个对象的坐标。使用方形图像的完整大小会在坐标集中产生巨大的重叠,并且通常坐标中的最后一个会隐藏下方对象的可点击性。
答案 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;
,结果0
和width
都是height
- 我猜这个对你来说不是问题。