使用Imagecomparer,如何将ToleranceRectangle的中间部分排除在比较之外

本文关键字:排除 比较 中间部 Imagecomparer ToleranceRectangle 使用 | 更新日期: 2023-09-27 17:59:59

我在移动测试项目中使用imagecomparer,我可以将基线图像与当前屏幕截图进行比较,但问题在于屏幕截图的某个部分总是在变化,我想将该部分排除在比较之外。这是我的代码:

private bool RunVisualCheck(string screen, string resultsPath, string baseline = "baseline.jpeg", string screenshot = "screenshot.jpeg")
    {
        GetScreenshot(resultsPath + screenshot);
        var baselineImage = Image.FromFile(resultsPath + baseline);
        var actualImage = Image.FromFile(resultsPath + screenshot);
        Image diffImage;
        int ignoreTop = 64;
        var compareArea = new List<ToleranceRectangle>
        {
            new ToleranceRectangle()
            {
                Rectangle = new Rectangle(0,ignoreTop,baselineImage.Width, baselineImage.Height - ignoreTop),
                Difference = new ColorDifference()
            }
        };
        bool goodCompare = ImageComparer.Compare(actualImage, baselineImage, compareArea, out diffImage);
        if (!goodCompare)
        {
            diffImage.Save(resultsPath + "diffImage.jpeg");
        }
        return goodCompare;
    }
private void GetScreenshot(string pathFile)
    {
        System.Threading.Thread.Sleep(2000); // Temp fix to wait until page loads
        var srcFiler = ((ITakesScreenshot)mobileDriver).GetScreenshot();
        srcFiler.SaveAsFile(pathFile, ImageFormat.Jpeg);
    }

这里有一个例子(不是正在测试的应用程序),我想从整体屏幕截图中排除红色矩形内的区域,以进行比较。

移动屏幕截图示例

有简单的方法吗?

使用Imagecomparer,如何将ToleranceRectangle的中间部分排除在比较之外

找到了一种比试图将一个部分排除在比较之外更好的方法。感谢同事的建议,我将不需要比较的部分涂黑,然后保存此图像。在基线图像和屏幕截图上执行此操作将具有与完全排除它相同的效果。这是代码:

Image image = Image.FromFile(@"C:'Screenshots'Screenshot.jpeg");
using (Graphics g = Graphics.FromImage(image))
{
    SolidBrush brush = new SolidBrush(Color.Black);
    Size size = new Size(image.Width, 64);
    Point point = new Point(0, 0);
    Rectangle rectangle;
    rectangle = new Rectangle(point, size);
    g.FillRectangle(brush, rectangle);
}
image.Save(@"C:'Screenshots'Screenshot.jpeg");