Home  >  Article  >  Backend Development  >  golang implementation screenshot

golang implementation screenshot

王林
王林Original
2023-05-16 12:47:381062browse

In recent years, as people have become more and more dependent on the Internet, many industries have begun to transform towards digitalization. Among them, the demand for network communication and remote working is growing day by day, and various online conferencing and remote working tools have also sprung up. For these application scenarios, the screenshot function has become an indispensable function. In this article, we will introduce how to use Golang, a powerful programming language, to implement the screenshot function.

Golang Introduction
Golang, also known as the Go language, is an emerging programming language. Its design goals are to be easy to learn, efficient and fast, while ensuring the safety and reliability of the code. Golang has a garbage collection mechanism and concurrent programming primitives, which are very suitable for Internet application development.

Golang screenshot implementation
In Golang, implementing the screenshot function is mainly divided into the following steps:

  1. First, you need to introduce some necessary packages, such as image and syscall wait.

import (

"image"
"os"
"syscall"

)

  1. Next, you need to use the system function to obtain the currently running window information and obtain the operating system window handle, and then you can Convert to image object in Golang.

func getScreenShot() error {

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. Then, you need to get the image data from the device context and store it into Golang in the image object.

pixels := 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(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})
}

}

  1. Finally, save the image object in Golang as a file.

file, err := os.Create("screenshot.png")
if err != nil {

return err

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

return err

}

Complete code implementation:

package main

import (

"fmt"
"image"
"image/color"
"image/png"
"os"
"syscall"
"unsafe"

)

func getScreenShot() error {

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)
}

}

Conclusion
This article outlines how to use Golang to implement the screenshot function. Golang is an efficient, simple and safe programming language with good concurrency performance and is suitable for various application scenarios. Through the introduction of this article, I believe that readers have mastered the skills of how to use Golang to implement the screenshot function. I hope this article will be helpful to everyone.

The above is the detailed content of golang implementation screenshot. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Previous article:golang deployment systemNext article:golang deployment system