2012-12-09 63 views
8

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

+0

在stackoverflow.com上,当你认为某些答案有帮助或解决了你的问题时,你应该加大它(按下三角形)或接受它(按下三角形下面的棒)。 – rputikar

回答

0

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

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

5

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

同时,如GeertJohan所建议的,您可以使用os.exec来运行外部程序并捕获屏幕(请参阅下面的示例代码)。例如,你可以使用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()) 
} 
1

我不知道任何跨平台库(应该可以运行ImageMagick的一个平台上工作),但你可以用做当X服务器存在时,存储库为xgbutil。你可以看到一个example of how to capture a screenshot here

如果你想在Mac/Windows系统上使用这个工具,我可能会先检查源代码为go.wde,其中包括Windows和Mac的后端。我怀疑你会直接找到代码来捕获截图,但它可能会给你一些提示或路径。

3

现在有:

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

+0

vova616 /截图还有另一个答案,但由于缺乏对macOS的支持,它还没有真正的跨平台。我最近实施了一个本地解决方案,希望它能尽快帮助更多的开发人员! – Kesarion