Home > Backend Development > Golang > golang implementation screenshot

golang implementation screenshot

王林
Release: 2023-05-16 12:47:38
Original
1140 people have browsed it

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"
Copy after login

)

  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
Copy after login

}

  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
Copy after login
Copy after login
Copy after login
Copy after login

}
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
Copy after login
Copy after login
Copy after login
Copy after login

}
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})
}
Copy after login

}

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

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

return err
Copy after login
Copy after login
Copy after login
Copy after login

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

return err
Copy after login
Copy after login
Copy after login
Copy after login

}

Complete code implementation:

package main

import (

"fmt"
"image"
"image/color"
"image/png"
"os"
"syscall"
"unsafe"
Copy after login

)

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
Copy after login

}

func main() {

err := getScreenShot()
if err != nil {
    fmt.Println(err)
}
Copy after login

}

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!

source:php.cn
Statement of this Website
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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template