【发布时间】:2017-09-04 19:56:00
【问题描述】:
我的目标是裁剪图像,同时保持 16:9 的纵横比,同时根据当前比例将原始图像放在中心,而不丢失原始图像的一部分。
我的裁剪尺寸是 breiteNeu 用于裁剪图像的宽度,hoeheNeu 用于裁剪图像的高度。 xNeu 是要裁剪的图像的 x 坐标,yNeu 是要裁剪的图像的 y 坐标。
这是我的代码
if (breiteNeu > hoeheNeu)
{
if (breiteNeu / hoeheNeu > 1.777)
{
Console.WriteLine("1");
float hj = 0.5625f * breiteNeu;
yNeu -= (int)((hj - hoeheNeu) / 2);
hoeheNeu = (int)hj;
}
else
{
Console.WriteLine("2");
float bj = 1.777f * hoeheNeu;
xNeu -= (int)((bj - breiteNeu) / 2);
breiteNeu = (int)bj;
}
}
else
{
if (breiteNeu / hoeheNeu > 0.5625)
{
Console.WriteLine("3");
float hj = 1.777f * breiteNeu;
yNeu -= (int)((hj - hoeheNeu) / 2);
hoeheNeu = (int)hj;
}
else
{
Console.WriteLine("4");
float bj = 0.5625f * hoeheNeu;
xNeu -= (int)((bj - breiteNeu) / 2);
breiteNeu = (int)bj;
}
}
1 到 3(Console.WriteLine("1") 到 Console.WriteLine("3"))似乎可行,但 4 总是通过减小宽度来裁剪图像的一部分以保持纵横比。
我需要如何更改特别是 4 以保持纵横比同时包含整个 breiteNeu 和 hoeheNeu(hoeheNeu = hj 之前的原始部分。breiteNeu = bj 被分配)区域?
【问题讨论】:
-
当你有十进制数时不要使用 int。使用小数或浮点数。这甚至可能足以修复它。
-
@Sami 我更新了它。还是同样的问题。数学正确吗?
-
您仍在将其投射到
int此处:xNeu -= (int)((bj - breiteNeu) / 2);。这会将其四舍五入为最接近的整数,这可能会导致问题。 -
@Sami 这些是像素坐标,它们必须是
int。