图像比例比较的双倍精度

本文关键字:精度 比较 图像 | 更新日期: 2023-09-27 18:22:14

我的数学能力很差,而且图像调整算法也有问题。我正在尝试将图像调整为特定的比例。

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方法(我在这里找到了它)。有时它失败了,图像被无限期地裁剪,我试图记录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都是计算值,那么你必须增加ε。"-我如何做到这一点并找到最佳的裁剪像素数?

图像比例比较的双倍精度

您不需要迭代来获得您的值。计算目标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
}