我有一组不同形状和大小的各种物体的图像。它们上面设置了透明背景,但图像的整个尺寸是正方形。我想计算一个包含图像中对象的坐标框(左上 x/y,右下 x/y),同时尽可能多地忽略透明背景。我需要在代码中即时执行此操作。
是否有可用于 C# 的示例或库允许我执行此操作?我在一个网站中使用这些,其中几个对象动态叠加到一个图像中,我想计算一个图像映射,其中包含合并图像中每个对象的坐标。使用方形图像的完整尺寸会在坐标集中创建巨大的重叠,并且通常最后一个坐标会隐藏较低的对象,使其无法点击。
好吧,使用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
- 我想这对你来说不是问题。