是否有一种跨平台的方式来捕获Google的Go中的屏幕?或者任何方式,但跨平台将是首选。
答案 0 :(得分: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支持(在合并拉取请求之前),请获取:
答案 1 :(得分:6)
不幸的是,没有库可以做到这一点。 magickwand(C编程语言和ImageMagick图像处理库)有几个绑定,请参阅http://go-lang.cat-v.org/library-bindings,但这些绑定不完整,没有屏幕捕获功能。
同时,正如GeertJohan建议的那样,您可以使用os.exec运行外部程序并捕获屏幕(请参阅下面的示例代码)。例如,您可以使用imagemagick中的import
命令来捕获屏幕(应该在可以运行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())
}
答案 2 :(得分:1)
我不知道任何跨平台库,但是当存在X服务器时,您可以使用xgbutil库执行此操作。您可以看到example of how to capture a screenshot here。
如果你想在Mac / Windows系统上运行,我可能首先检查go.wde的来源,其中包括Windows和Mac的后端。我怀疑你会直接找到代码来捕获那里的截图,但它可能会给你一些提示或路径。
答案 3 :(得分:1)
没有跨平台的方式来捕获Google的Go屏幕,因为捕获屏幕依赖于底层操作系统的特定API。但Go的库可以做到这一点。
答案 4 :(得分:0)
我找不到一个库来做这件事。稳定的跨平台屏幕捕获需要大量工作。屏幕捕获需要与操作系统的显示管理器/服务器或帧缓冲区连接,这对于许多操作系统和Linux发行版来说是不同的。您必须为每个OS API编写接口(或包装提供功能的库),然后在单个包中抽象所有不同的方法,以便它跨平台工作。
另一种方法是运行现有的屏幕捕获应用程序(命令行)来为您执行屏幕捕获工作,包括保存到文件。然后在go应用程序中读取该文件。要使Go应用程序运行第三方应用程序,请使用os/exec包,它位于标准库中。对于Linux,您可以使用fbgrab将帧缓冲区保存到png文件中。
答案 5 :(得分:0)
是的。这是一个两步的过程:
研究https://github.com/ShareX/ShareX/tree/master/ShareX.ScreenCaptureLib以查看要捕获屏幕/窗口的win32 API调用 将该逻辑转换为Go。您可以使用少数现有的win32 api Go绑定之一(例如https://github.com/AllenDang/w32)。如果他们缺少所需的功能,您可以添加更多包装器。
答案 6 :(得分:0)
该库似乎可以满足您的需求: 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