2012-12-09 64 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