15

是否有跨平台的方式来捕获谷歌的 Go 中的屏幕?或任何方式,但首选跨平台。

4

7 回答 7

8

现在有:

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 支持(直到合并拉取请求),请获取:

https://github.com/kesarion/screenshot

于 2016-12-21T13:40:19.507 回答
6

不幸的是,没有图书馆可以做到这一点。magickwand有几个绑定(C 编程语言和 ImageMagick 图像处理库),请参阅http://go-lang.cat-v.org/library-bindings但这些不完整且没有屏幕捕获功能.

同时,正如 GeertJohan 所建议的,您可以使用 os.exec 运行外部程序并捕获屏幕(请参见下面的示例代码)。例如,您可以使用importimagemagick 的命令来捕获屏幕(应该在可以运行 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())
}
于 2012-12-10T09:28:27.723 回答
1

我不知道任何跨平台库,但是当存在 X 服务器时,您可以使用xgbutil库来执行此操作。您可以在此处查看如何截取屏幕截图的示例

如果你想让它在 Mac/Windows 系统上运行,我可能会先检查go.wde的源代码,其中包括 Windows 和 Mac 的后端。我怀疑你会直接在其中找到捕获屏幕截图的代码,但它可能会给你一些提示或遵循的路径。

于 2012-12-10T17:31:52.243 回答
1

该库似乎满足您的需求: 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
于 2019-09-18T07:21:14.020 回答
1

Google 的 Go中没有跨平台的截屏方式,因为截屏依赖于底层操作系统的特定 API。但是有 Go 的可以做到这一点。

例如https://github.com/vova616/screenshot

于 2015-12-09T08:43:47.103 回答
0

我找不到一个图书馆来做到这一点。稳定的跨平台截屏需要大量的工作。屏幕捕获需要与操作系统的显示管理器/服务器或帧缓冲区进行交互,这对于许多操作系统和 Linux 发行版来说是不同的。您必须为每个 OS API 编写接口(或包装提供功能的库),然后将所有不同的方法抽象到一个包中,以便它可以跨平台工作。

另一种方法是运行现有的屏幕捕获应用程序(命令行)为您完成屏幕捕获工作,包括保存到文件。然后在你的 go 应用程序中读取文件。要让 Go 应用程序运行第三方应用程序,请使用os/exec包,它位于标准库中。对于 Linux,您可以使用fbgrab将帧缓冲区保存到 png 文件中。

于 2012-12-10T09:09:16.243 回答
0

这是。这是一个两步的过程:

研究https://github.com/ShareX/ShareX/tree/master/ShareX.ScreenCaptureLib以查看调用哪些 win32 API 来捕获屏幕/窗口 将该逻辑转换为 Go。您可以使用少数现有的 win32 api Go 绑定之一(例如https://github.com/AllenDang/w32)。如果它们缺少所需的功能,您可以添加更多包装器。

于 2016-01-09T16:45:20.530 回答