我对数学非常弱,并且在图像调整大小算法方面存在问题。 我正在尝试将图像调整为特定比例。
double neededRatio = 1.6d;
while (!AboutEqual(imageRatio, neededRatio))
{
var cropPixels = 10;
//crop code
...
imageRatio = (double)img.Width / img.Height;
}
public static bool AboutEqual(double x, double y)
{
double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15;
return Math.Abs(x - y) <= epsilon;
}
问题是,我似乎无法找到合适的像素数来实际使AboutEqual
方法正常工作(我发现它here)。有时失败并且图像无限期地被裁剪,我试图记录AboutEqual
方法的内部工作,并且它显示我觉得奇怪的东西,如:
X: 1.5249500998004 Y: 1.6 result: false
X: 1.55600814663951 Y: 1.6 result: false
X: 1.55600814663951 Y: 1.6 result: false
X: 1.58835758835759 Y: 1.6 result: false
X: 1.62208067940552 Y: 1.6 result: false
X: 1.60084925690021 Y: 1.6 result: false
X: 1.5796178343949 Y: 1.6 result: false
X: 1.61388286334056 Y: 1.6 result: false
X: 1.59219088937093 Y: 1.6 result: false
X: 1.62749445676275 Y: 1.6 result: false
X: 1.60532150776053 Y: 1.6 result: false
X: 1.58314855875831 Y: 1.6 result: false
X: 1.61904761904762 Y: 1.6 result: false
X: 1.59637188208617 Y: 1.6 result: false
X: 1.63341067285383 Y: 1.6 result: false
链接的问题是“如果x和y都是计算值,那么你必须增加epsilon。” - 我该怎么做并找到要裁剪的最佳像素数?
答案 0 :(得分:3)
您无需迭代即可获得价值。计算目标x
值,它会为您提供所需的比率,并删除额外的像素。
假设x
太大而您想裁剪它:
// x/y should be 1.6
double neededRatio = 1.6d;
// so if we know y, then x should be:
int xTarget = (int)Math.Round(y * neededRatio);
// pixels to crop
int pixelsToCrop = x - xTarget;
<强> [编辑] 强>
关键是,此代码获取您需要达到的目标x
(假设您需要比率)。如果你仍然需要一个循环,那么没有什么可以阻止你做的事情:
while (x > xTarget)
{
// crop 10 pixels
// and do magic stuff
}