是否有跨平台的方式来捕获谷歌的 Go 中的屏幕?或任何方式,但首选跨平台。
7 回答
现在有:
https://github.com/vova616/screenshot
go get github.com/vova616/screenshot
例子:
package main
import "github.com/vova616/screenshot"
func main() {
img, err := screenshot.CaptureScreen() // *image.RGBA
myImg := image.Image(img) // can cast to image.Image, but not necessary
}
如果您还需要 macOS 支持(直到合并拉取请求),请获取:
不幸的是,没有图书馆可以做到这一点。magickwand有几个绑定(C 编程语言和 ImageMagick 图像处理库),请参阅http://go-lang.cat-v.org/library-bindings但这些不完整且没有屏幕捕获功能.
同时,正如 GeertJohan 所建议的,您可以使用 os.exec 运行外部程序并捕获屏幕(请参见下面的示例代码)。例如,您可以使用import
imagemagick 的命令来捕获屏幕(应该在可以运行 imagemagick 的平台上工作)
package main
import (
"bytes"
"fmt"
"log"
"os/exec"
)
func main() {
var buf bytes.Buffer
path, err := exec.LookPath("import")
if err != nil {
log.Fatal("import not installed !")
}
fmt.Printf("import is available at %s\n", path)
cmd := exec.Command("import", "-window", "root", "root.png")
cmd.Stdout = &buf
cmd.Stderr = &buf
err = cmd.Run()
if err != nil {
panic(err)
}
fmt.Println(buf.String())
}
我不知道任何跨平台库,但是当存在 X 服务器时,您可以使用xgbutil库来执行此操作。您可以在此处查看如何截取屏幕截图的示例。
如果你想让它在 Mac/Windows 系统上运行,我可能会先检查go.wde的源代码,其中包括 Windows 和 Mac 的后端。我怀疑你会直接在其中找到捕获屏幕截图的代码,但它可能会给你一些提示或遵循的路径。
该库似乎满足您的需求: https ://godoc.org/github.com/kbinani/screenshot
将屏幕截图图像捕获为 image.RGBA。支持 Mac、Windows、Linux、FreeBSD、OpenBSD、NetBSD 和 Solaris。
func Capture(x, y, width, height int) (*image.RGBA, error)
func CaptureDisplay(displayIndex int) (*image.RGBA, error)
func CaptureRect(rect image.Rectangle) (*image.RGBA, error)
func GetDisplayBounds(displayIndex int) image.Rectangle
func NumActiveDisplays() int
Google 的 Go中没有跨平台的截屏方式,因为截屏依赖于底层操作系统的特定 API。但是有 Go 的库可以做到这一点。
我找不到一个图书馆来做到这一点。稳定的跨平台截屏需要大量的工作。屏幕捕获需要与操作系统的显示管理器/服务器或帧缓冲区进行交互,这对于许多操作系统和 Linux 发行版来说是不同的。您必须为每个 OS API 编写接口(或包装提供功能的库),然后将所有不同的方法抽象到一个包中,以便它可以跨平台工作。
另一种方法是运行现有的屏幕捕获应用程序(命令行)为您完成屏幕捕获工作,包括保存到文件。然后在你的 go 应用程序中读取文件。要让 Go 应用程序运行第三方应用程序,请使用os/exec包,它位于标准库中。对于 Linux,您可以使用fbgrab将帧缓冲区保存到 png 文件中。
这是。这是一个两步的过程:
研究https://github.com/ShareX/ShareX/tree/master/ShareX.ScreenCaptureLib以查看调用哪些 win32 API 来捕获屏幕/窗口 将该逻辑转换为 Go。您可以使用少数现有的 win32 api Go 绑定之一(例如https://github.com/AllenDang/w32)。如果它们缺少所需的功能,您可以添加更多包装器。