ホームページ > バックエンド開発 > Golang > golang実装のスクリーンショット

golang実装のスクリーンショット

王林
リリース: 2023-05-16 12:47:38
オリジナル
1115 人が閲覧しました

近年、人々のインターネットへの依存度が高まるにつれ、多くの業界がデジタル化に向けた変革を始めています。中でもネットワークコミュニケーションやリモートワークへの需要は日に日に高まっており、さまざまなオンライン会議やリモートワークツールも登場しています。こうした応用シーンにおいて、スクリーンショット機能は欠かせない機能となっています。この記事では、強力なプログラミング言語である Golang を使用してスクリーンショット機能を実装する方法を紹介します。

Golang の概要
Golang は、Go 言語としても知られる新興プログラミング言語です。その設計目標は、コードの安全性と信頼性を確保しながら、学習しやすく、効率的かつ高速であることです。 Golang には、ガベージ コレクション メカニズムと同時プログラミング プリミティブがあり、インターネット アプリケーション開発に非常に適しています。

Golang スクリーンショットの実装
Golang では、スクリーンショット機能の実装は主に次の手順に分かれています。

  1. 最初に、画像や画像などの必要なパッケージを導入する必要があります。システムコール待機。

import (

"image"
"os"
"syscall"
ログイン後にコピー

)

  1. 次に、system 関数を使用して、現在実行中のウィンドウ情報を取得し、オペレーティング システムのウィンドウを取得する必要があります。ハンドルを指定すると、Golang で画像オブジェクトに変換できます。

func getScreenShot() エラー {

hwnd := syscall.GetForegroundWindow()
if hwnd == 0 {
    return fmt.Errorf("could not find foreground window")
}
dc := syscall.GetDC(hwnd)
defer syscall.ReleaseDC(hwnd, dc)
rect := &syscall.Rect{}
if !syscall.GetWindowRect(hwnd, rect) {
    return fmt.Errorf("could not get window rect")
}
width := rect.Right - rect.Left
height := rect.Bottom - rect.Top
img, err := image.NewRGBA(image.Rect(0, 0, width, height))
if err != nil {
    return err
}
return nil
ログイン後にコピー

}

  1. 次に、デバイス コンテキストから画像データを取得し、Golang に保存する必要があります。画像オブジェクト内。

ピクセル := make([]uint8, widthheight4)
_, _, err = syscall.BitBlt(0, 0, width, height, dc , 0, 0, syscall.SRCCOPY)
if err != nil {

return err
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

}
bi := &syscall.Bitmapinfo{}
bi.BmiHeader.BiSize = uint32(安全ではありません。 Sizeof(bi.BmiHeader))
bi.BmiHeader.BiWidth = width;
bi.BmiHeader.BiHeight = -height;
bi.BmiHeader.BiPlanes = 1
bi.BmiHeader.BiBitCount = 32
bi.BmiHeader.BiCompression = syscall.BI_RGB
bi.BmiHeader.BiSizeImage = uint32(len(ピクセル))
if _, _, err = syscall.GetDIBits(dc, syscall.HBITMAP(syscall. GetStockObject(syscall.BLACK_BRUSH)), 0, uint32(height), &pixels[0], bi, 0); err != nil {

return err
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

}
for y := 0; y <; height; y {

for x := 0; x < width; x++ {
    i := (y*width + x) * 4
    R := pixels[i+2]
    G := pixels[i+1]
    B := pixels[i]
    img.Set(x, y, color.RGBA{R, G, B, 255})
}
ログイン後にコピー

}

  1. 最後に、Golang の画像オブジェクトをファイルとして保存します。

ファイル、エラー := os.Create("screenshot.png")
if エラー != nil {

return err
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

}
defer file.Close()
if err = png.Encode(file, img); err != nil {

return err
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

}

完全なコード実装:

パッケージ main

import (

"fmt"
"image"
"image/color"
"image/png"
"os"
"syscall"
"unsafe"
ログイン後にコピー

)

func getScreenShot() エラー {

hwnd := syscall.GetForegroundWindow()
if hwnd == 0 {
    return fmt.Errorf("could not find foreground window")
}
dc := syscall.GetDC(hwnd)
defer syscall.ReleaseDC(hwnd, dc)
rect := &syscall.Rect{}
if !syscall.GetWindowRect(hwnd, rect) {
    return fmt.Errorf("could not get window rect")
}
width := rect.Right - rect.Left
height := rect.Bottom - rect.Top
img, err := image.NewRGBA(image.Rect(0, 0, width, height))
if err != nil {
    return err
}

defer func() {
    if panicErr := recover(); panicErr != nil {
        err = fmt.Errorf("%v", panicErr)
    }
}()

pixels := make([]uint8, width*height*4)
_, _, err = syscall.BitBlt(0, 0, width, height, dc, 0, 0, syscall.SRCCOPY)
if err != nil {
    return err
}
bi := &syscall.Bitmapinfo{}
bi.BmiHeader.BiSize = uint32(unsafe.Sizeof(bi.BmiHeader))
bi.BmiHeader.BiWidth = width;
bi.BmiHeader.BiHeight = -height;
bi.BmiHeader.BiPlanes = 1
bi.BmiHeader.BiBitCount = 32
bi.BmiHeader.BiCompression = syscall.BI_RGB
bi.BmiHeader.BiSizeImage = uint32(len(pixels))

if _, _, err = syscall.GetDIBits(dc, syscall.HBITMAP(syscall.GetStockObject(syscall.BLACK_BRUSH)), 0, uint32(height), &pixels[0], bi, 0); err != nil {
    return err
}

for y := 0; y < height; y++ {
    for x := 0; x < width; x++ {
        i := (y*width + x) * 4
        R := pixels[i+2]
        G := pixels[i+1]
        B := pixels[i]
        img.Set(x, y, color.RGBA{R, G, B, 255})
    }
}

file, err := os.Create("screenshot.png")
if err != nil {
    return err
}
defer file.Close()
if err = png.Encode(file, img); err != nil {
    return err
}

return nil
ログイン後にコピー

}

func main() {

err := getScreenShot()
if err != nil {
    fmt.Println(err)
}
ログイン後にコピー

}

結論
この記事では、Golang を使用してスクリーンショット機能を実装する方法について概要を説明します。 Golang は、優れた同時実行パフォーマンスを備えた効率的でシンプルかつ安全なプログラミング言語であり、さまざまなアプリケーション シナリオに適しています。この記事の導入により、読者の皆様は Golang を使用してスクリーンショット機能を実装する方法を習得されたと思います。

以上がgolang実装のスクリーンショットの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート