Google の Go で画面をキャプチャするクロスプラットフォームの方法はありますか? または、それについてはどうにかしますが、クロスプラットフォームが優先されます。
7 に答える
残念ながら、これを行うためのライブラリはありません。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())
}
画面のキャプチャは基盤となるオペレーティング システムの特定の API に依存するため、Google の Go で画面をキャプチャするクロスプラットフォームの方法はありません。しかし、これを行う Go 用のライブラリがあります。
クロスプラットフォーム ライブラリについては知りませんが、X サーバーが存在する場合はxgbutilライブラリを使用してこれを行うことができます。スクリーンショットをキャプチャする方法の例をここで見ることができます。
これを Mac/Windows システムで動作させたい場合は、Windows と Mac のバックエンドを含むgo.wdeのソースを調べることから始めると思います。そこにスクリーンショットをキャプチャするためのコードが直接見つかるとは思えませんが、いくつかのヒントやたどる道筋が得られるかもしれません。
です。これは 2 段階のプロセスです。
https://github.com/ShareX/ShareX/tree/master/ShareX.ScreenCaptureLibを調べて、画面/ウィンドウをキャプチャするために実行する win32 API 呼び出しを確認します。そのロジックを Go に変換します。数少ない既存の win32 api Go バインディングのいずれかを使用できます (例: https://github.com/AllenDang/w32 )。必要な機能が不足している場合は、ラッパーを追加できます。
これを行うためのライブラリが見つかりません。安定したクロスプラットフォームのスクリーン キャプチャには、多くの作業が必要です。スクリーン キャプチャには、オペレーティング システムのディスプレイ マネージャー/サーバーまたはフレーム バッファーとのインターフェイスが必要です。これは、多くのオペレーティング システムと Linux ディストリビューションで異なります。各 OS API のインターフェイスを作成する (または機能を提供するライブラリをラップする) 必要があり、その後、さまざまなメソッドをすべて単一のパッケージに抽象化して、クロスプラットフォームで動作するようにする必要があります。
これを行う別の方法として、既存のスクリーン キャプチャ アプリケーション (コマンド ライン) を実行して、ファイルへの保存を含むスクリーン キャプチャ作業を実行する方法があります。次に、go アプリケーションでファイルを読み取ります。Go アプリケーションでサードパーティ アプリケーションを実行するには、標準ライブラリにあるos/execパッケージを使用します。Linux では、fbgrabを使用してフレーム バッファを png ファイルに保存できます。