C# 裁剪图像返回错误坐标

2024-03-01

几天来我一直在尝试使用 Selenium 和不同的裁剪方法来裁剪特定的图像。

在我的代码之前有一个重要的说明 - 以下方法在两周前曾经有效,由于某种原因它现在返回一个坐标错误的图像

// Go to site
Driver.Navigate().GoToUrl("http://google.com");
Screenshot screenshot = driver.GetScreenshot();

using (var ms = new MemoryStream(screenshot.AsByteArray))
using (var imgShot = Image.FromStream(ms))
using (var src = new Bitmap(imgShot))
      {
        IWebElement element = driver.FindElement(By.XPath("//canvas"));
        Rectangle cropRect = new Rectangle(element.Location.X, element.Location.Y, element.Size.Width, element.Size.Height);

        var clone = src.Clone(cropRect, src.PixelFormat);
        clone.Save(filePath);
      }

我尝试过的事情:

1)我通常使用 Firefox 驱动程序来实现此目的,我尝试使用 ChromeDriver 代替并得到相同的结果。

2)我使用以下控制台命令检查元素坐标:$0.getBoundingClientRect(),并且我在代码中获得的位置与其匹配。

3)我尝试了 4 种不同的裁剪方法,包括这个:

IWebElement element = Driver.FindElement(By.XPath("//canvas"));
string filename = @"C:\Users\User\Desktop\test.png";
Screenshot screenshot = Driver.GetScreenshot();
screenshot.SaveAsFile(filename, ImageFormat.Png);

Rectangle cropRect = new Rectangle(element.Location.X, element.Location.Y,
    element.Size.Width, element.Size.Height);

using (Image imgShot = Image.FromFile(filename))
using (Bitmap original = new Bitmap(imgShot))
using (Bitmap target = new Bitmap(original, new Size(cropRect.Width, cropRect.Height)))
using (Graphics g = Graphics.FromImage(target))
{
    g.DrawImage(original, new Rectangle(0, 0, target.Width, target.Height),
        cropRect,
        GraphicsUnit.Pixel);
    target.Save(@"C:\Users\User\Desktop\test1.png", ImageFormat.Png);
}

需要明确的是,我得到的图像完全是空白的。在另一个网站上,我得到的图像不是空白的,所以我可以看出它只是在错误的坐标中。

4)我尝试了不同的网站和不同的元素,但它们的坐标都是错误的。

5)我尝试用谷歌搜索,发现很多不同的方法都行不通。这answer https://stackoverflow.com/a/26649763/3450204然而,说了一些关于分辨率的事情,这是我最好的猜测。我尝试使用原始分辨率和目标分辨率,没有发现任何差异。在创建 Graphics 变量之前或之后调用设置分辨率方法,并且仍然为零变化。

有趣的是,它在两周前可以工作,但我从未更改过代码......


您收到空白图像可能是因为该区域尚未渲染GetScreenshot叫做。 尝试等待看看是否是这种情况:

Thread.Sleep(3000);
Screenshot screenshot = ((ITakesScreenshot)element).GetScreenshot();

这也可能是由于页面中的实现阻止了网络抓取,在这种情况下,如果不深入研究代码,您将无能为力。

请注意,您不应该使用element.Location因为它返回相对于文档的坐标,而不是来自视口的坐标。 您还应该考虑致电GetScreenshot直接在一个IWebElement如果驱动支持的话。

这是捕获页脚的工作示例:

var options = new ChromeOptions();
options.AddArgument("disable-infobars");

var driver = new ChromeDriver(options);

driver.Url = "https://stackoverflow.com/questions";

IWebElement element = driver.FindElement(By.CssSelector("#footer"));

string filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), @"screenshot.png");

try {
    Thread.Sleep(500);
    Screenshot screenshot = ((ITakesScreenshot)element).GetScreenshot();
    screenshot.SaveAsFile(filePath, ScreenshotImageFormat.Png);
}
catch (WebDriverException) {

    var result = ((IJavaScriptExecutor)driver).ExecuteScript(
      "var elm = arguments[0];" +
      "elm.scrollIntoView(true);" +
      "var rect = elm.getBoundingClientRect();" +
      "return [rect.left, rect.top, rect.width, rect.height];"
      , element);

    int[] pts = Array.ConvertAll(((IReadOnlyCollection<object>)result).ToArray(), Convert.ToInt32);
    var rect = new Rectangle(pts[0], pts[1], pts[2], pts[3]);

    Screenshot screenshot = ((ITakesScreenshot)driver).GetScreenshot();

    using (var mstream = new MemoryStream(screenshot.AsByteArray))
    using (var bitmap = (Bitmap)Image.FromStream(mstream, false, false)) {
        rect.Intersect(new Rectangle(0, 0, bitmap.Width, bitmap.Height));

        if (rect.IsEmpty)
            throw new ArgumentOutOfRangeException("Cropping rectangle is out of range.");

        var clone = bitmap.Clone(rect, bitmap.PixelFormat);
        clone.Save(filePath);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 裁剪图像返回错误坐标 的相关文章

  • 使用实体框架从集合中删除项目

    我正在使用DDD 我有一个 Product 类 它是一个聚合根 public class Product IAggregateRoot public virtual ICollection
  • 有什么工具可以说明每种方法运行需要多长时间?

    我的程序的某些部分速度很慢 我想知道是否有我可以使用的工具 例如它可以告诉我可以运行 methodA 花了 100ms 等等 或者类似的有用信息 如果您使用的是 Visual Studio Team System 性能工具 中有一个内置分析
  • 在 Xcode4 中使用 Boost

    有人设置 C Xcode4 项目来使用 Boost 吗 对于一个简单的 C 控制台应用程序 我需要在 Xcode 中设置哪些设置 Thanks 用这个来管理它 和这个
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • 如何在 VS 中键入时显示方法的完整文档?

    标题非常具有描述性 是否有任何扩展可以让我看到我正在输入的方法的完整文档 我想查看文档 因为我可以在对象浏览器中看到它 其中包含参数的描述和所有内容 而不仅仅是一些 摘要 当然可以选择查看所有覆盖 它可能是智能感知的一部分 或者我不知道它并
  • VS30063:您无权访问 https://dev.azure.com

    我正在尝试在 asp net core 2 1 mvc 应用程序中使用以下代码连接 Azure DevOps Uri orgUrl new Uri https dev azure com xxxxx String personalAcces
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 是否有与 C++11 emplace/emplace_back 函数类似的 C# 函数?

    从 C 11 开始 可以写类似的东西 include
  • Xamarin Android:获取内存中的所有进程

    有没有办法读取所有进程 而不仅仅是正在运行的进程 如果我对 Android 的理解正确的话 一次只有一个进程在运行 其他所有进程都被冻结 后台进程被忽略 您可以使用以下代码片段获取当前正在运行的所有 Android 应用程序进程 Activ
  • C++派生模板类继承自模板基类,无法调用基类构造函数[重复]

    这个问题在这里已经有答案了 我试图从基类 模板 继承 派生类也是模板 它们具有相同的类型 T 我收到编译错误 非法成员初始化 Base 不是基类或成员 为什么 如何调用基类构造函数 include
  • 范围和临时初始化列表

    我试图将我认为是纯右值的内容传递到范围适配器闭包对象中 除非我将名称绑定到初始值设定项列表并使其成为左值 否则它不会编译 这里发生了什么 include
  • 事件日志写入错误

    很简单 我想向事件日志写入一些内容 protected override void OnStop TODO Add code here to perform any tear down necessary to stop your serv
  • 通过不同 DLL 或 EXE 中的指针或引用访问 STL 对象时发生访问冲突

    我在使用旧版 VC6 时遇到以下问题 我只是无法切换到现代编译器 因为我正在处理遗留代码库 http support microsoft com kb 172396 http support microsoft com kb 172396
  • 组合框项目为空但数据源已满

    将列表绑定到组合框后 其 dataSource Count 为 5 但组合框项目计数为 0 怎么会这样 我习惯了 Web 编程 而且这是在 Windows 窗体中进行的 所以不行combo DataBind 方法存在 这里的问题是 我试图以
  • std::bind 重载解析

    下面的代码工作正常 include
  • 是否有一个 C++ 库可以从 PDF 文件中提取文本,例如 PDFBox for Java? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 去年 我使用 PDFBox 在 Java 中创建了一个应用程序来获取某些 PDF 文件中的原始文本 现在
  • 使用 Selenium 处理验证码

    我正在尝试自动化一个表单 在表单提交过程中我会得到重新验证码 我陷入困境并弄清楚我们如何使用 selenium webdriver 处理验证码文本 虽然这个验证码正在实时进行图灵测试实施 但是我仍然在寻找某种方法来处理这种情况 所以你不能真
  • Fluent NHibernate 日期时间 UTC

    我想创建一个流畅的 nhibernate 映射来通过以下方式映射 DateTime 字段 保存时 保存 UTC 值 读取时 调整为本地时区值 实现此映射的最佳方法是什么 就我个人而言 我会将日期存储在 UTC 格式的对象中 然后在读 写时在
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它

随机推荐

  • 在Python中将整数转换为字符串

    如何将整数转换为字符串 42 42 For the reverse see How do I parse a string to a float or int https stackoverflow com questions 379906
  • 无法让 Ninject.Extensions.Interception 工作

    多年来我一直在努力弄清楚这是我们的 当我尝试将我的类与拦截器绑定时 我收到以下异常 Kernel Bind
  • 多参数类型同义词实例

    我试图弄清楚是否可以 以及如何 为多参数类型同义词定义类实例 例如 LANGUAGE MultiParamTypeClasses FlexibleInstances type F a b a gt b data DF a b DF a gt
  • OpenCl 代码可以在一台机器上运行,但我在另一台机器上收到 CL_INVALID_KERNEL_ARGS

    我有以下代码 它在一台机器上运行良好 但是当我尝试在另一台具有更好显卡的机器上运行它时 我收到错误 global 0 512 global 1 512 local 0 16 local 1 16 ciErrNum clEnqueueNDRa
  • SQL查询从多个表返回数据

    我想了解以下信息 如何从数据库中的多个表中获取数据 有哪些类型的方法可以做到这一点 什么是联接和并集 它们之间有何不同 与其他方法相比 我应该什么时候使用每一种方法 我计划在我的 例如 PHP 应用程序中使用它 但不想对数据库运行多个查询
  • 删除表中的最后一行

    我有一个简单的问题 我想删除表中的最后一行 我复制了一个删除选中行的函数 function deleterow tableID try var table document getElementById tableID var rowCou
  • 删除 Ruby 中字符串中的空白换行符

    我有一串由四个空白行组成的字符串 总共八行如下 str aaa n n nbbb n nccc ddd n 我想在一行中返回这一切 单行输出应如下所示 aaabbbcccddd 我使用了各种修剪功能来获取输出 但仍然失败 我在这里必须使用什
  • 如何使用 Axios 发布到 Django?

    我正在从 Jquery AJAX 迁移到 Axios 因为我使用的是 ReactJS 所以我认为它更干净 我在向服务器发布一个简单的请求时遇到了一些麻烦 post 方法会通过我的视图 但每当我print request POST 我有一个空
  • 无法在当前状态下启动设备:已启动

    在模拟器中运行 构建 运行 项目时 对 Xcode6 beta 中的 无法在当前状态下启动设备 已启动 错误的任何猜测 我刚刚在 Xcode 6 中运行我现有的项目 我发现了上面的消息 我尝试清理 删除派生数据 甚至重新启动模拟器也不起作用
  • 如何在 python concurrent.futures 中中断 time.sleep()

    我正在玩并发期货 https docs python org 3 library concurrent futures html 目前我未来的电话time sleep secs 看起来Future cancel https docs pyt
  • 如何从外部属性文件访问 pom.xml 中的变量?

    我需要通过一个键来获取值pom xml来自外部属性文件 属性文件的位置位于src main resources dev properties 我尝试通过使用 Maven 中的属性来解决这个问题 请帮我 pom xml
  • 多次使用 std::async 来执行小任务性能友好吗?

    为了提供一些背景信息 我正在处理一个保存的文件 在使用正则表达式将文件拆分为其组件对象后 我需要根据对象的类型来处理对象的数据 我目前的想法是使用并行性来获得一点性能增益 因为加载每个对象是彼此独立的 所以我要定义一个LoadObject函
  • android,如何在sqlitedatabase中执行sql文件

    我有 food db sql 文件存储在 res raw 文件夹中 它里面有大量的 插入 我的问题是如何执行文件并将数据放入我的 Android 应用程序中的 sqlite 数据库中 这是我的数据库代码 有什么建议么 private sta
  • 读取文本文件块

    我有一个文本文件 其中每隔几行后就会在行开头重复一个特定字符 没有 之间的线数不固定 我能够找出发生这种情况的那些行 我想读一下中间的那些行 using StreamReader sr new StreamReader text file
  • 在 MongoDB 上执行聚合/集合交集

    我有一个查询 在对示例数据集执行一些聚合后 将以下示例视为中间数据 fileid 字段包含文件的 id 以及包含对相应文件进行了一些更改的用户数组的用户数组 id fileid 12 user a b c d id fileid 13 us
  • 我如何学习 ASP.NET? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 添加带动画的子视图

    任何人都可以帮我添加带有动画的子视图吗 我想添加带有像 CATransition 这样的动画的子视图 但是对于这个类 我们只有几种不同的动画类型 但我正在寻找实现它自己的动画的能力 视图的不同部分出现在不同的时间 也许存在一些例子或其他东西
  • watchOS2 通知模拟器

    我在 XCode 上的 watchOS2 模拟器中遇到了一个奇怪的错误 我使用 UILocalNotification 处理通知并修改静态通知的情节提要 但是当我检查值 Wants Sash Blur 并构建时 它会出现与 Carousel
  • 如何模拟反应路由器上下文

    我有相当简单的反应组件 链接包装器 如果路由处于活动状态 则会添加 活动 类 import React PropTypes from react import Link from react router const NavLink pro
  • C# 裁剪图像返回错误坐标

    几天来我一直在尝试使用 Selenium 和不同的裁剪方法来裁剪特定的图像 在我的代码之前有一个重要的说明 以下方法在两周前曾经有效 由于某种原因它现在返回一个坐标错误的图像 Go to site Driver Navigate GoToU