Захват экрана в Go?

Существует ли кросс-платформенный способ захвата экрана в Google Go? Или любой вариант, но перекрестная платформа будет предпочтительнее.

Ответ 1

Сейчас есть:

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

Ответ 2

К сожалению, для этого нет библиотеки. Существует несколько привязок для 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())
}

Ответ 3

Я не знаю никакой кросс-платформенной библиотеки, но вы можете сделать это с помощью библиотеки xgbutil, когда X-сервер настоящее время. Вы можете увидеть пример того, как сделать снимок экрана здесь.

Если вы хотите, чтобы это работало в системах Mac/Windows, я, вероятно, начинал бы с изучения источника go.wde, который включает в себя серверы для Windows и Mac. Я сомневаюсь, что вы сразу найдете код для захвата скриншота, но он может дать вам некоторые подсказки или путь к следующему.

Ответ 4

Существует не межплатформенный способ, чтобы захватить экран в Google Go, потому что захват экрана зависит от конкретного API базовых операционных систем. Но для Go существуют библиотеки, которые делают это.

Например https://github.com/vova616/screenshot

Ответ 5

Я не могу найти библиотеку, чтобы сделать это. Стабильный кросс-платформенный захват экрана требует большой работы. Для захвата экрана требуется взаимодействие с диспетчером отображения/сервером операционных систем или фрейм-буфером, который отличается для многих операционных систем и дистрибутивов Linux. Вам придется писать интерфейсы для каждого OS API (или обертывать библиотеки, которые предоставляют функциональность), а затем абстрагировать все разные методы в одном пакете, чтобы он работал кросс-платформенным.

Другим способом сделать это будет запуск существующего приложения для захвата экрана (командной строки) для выполнения работы по захвату экрана, включая сохранение в файл. Затем прочитайте файл в своем приложении. Чтобы приложение Go запускало стороннее приложение, используйте пакет os/exec, он находится в стандартной библиотеке. Для Linux вы можете использовать fbgrab для сохранения фреймового буфера в файл png.

Ответ 6

Это. Это двухэтапный процесс:

Изучите https://github.com/ShareX/ShareX/tree/master/ShareX.ScreenCaptureLib, чтобы узнать, какие вызовы API win32 необходимо сделать для захвата экрана/окна Переведите эту логику, чтобы идти. Вы можете использовать один из немногих существующих привязок Go для win32 api Go (например, https://github.com/AllenDang/w32). Если у них отсутствует необходимая функциональность, вы можете добавить больше оберток.

Ответ 7

Эта библиотека, кажется, отвечает вашим потребностям: https://godoc.org/github.com/kbinani/screenshot

captures screen-shot image as image.RGBA. Mac, Windows, Linux, FreeBSD, OpenBSD, NetBSD, и Solaris are supported.

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