欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

golang怎么實(shí)現(xiàn)截圖功能

這篇文章主要介紹“golang怎么實(shí)現(xiàn)截圖功能”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“golang怎么實(shí)現(xiàn)截圖功能”文章能幫助大家解決問題。

站在用戶的角度思考問題,與客戶深入溝通,找到輝縣網(wǎng)站設(shè)計(jì)與輝縣網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站建設(shè)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名申請(qǐng)、網(wǎng)頁空間、企業(yè)郵箱。業(yè)務(wù)覆蓋輝縣地區(qū)。

在Golang中,實(shí)現(xiàn)截圖功能主要分為以下幾個(gè)步驟:

  1. 首先,需要引入一些必要的包,比如image和syscall等。

import (

"image"
"os"
"syscall"

)

  1. 接著,需要使用系統(tǒng)函數(shù)獲取當(dāng)前正在運(yùn)行的窗口信息,獲取操作系統(tǒng)窗口句柄,然后可轉(zhuǎn)換為Golang中的圖像對(duì)象。

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. 然后,需要從設(shè)備上下文中獲取圖像數(shù)據(jù),將其存儲(chǔ)到Golang中的圖像對(duì)象中。

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. 最后,將Golang中的圖像對(duì)象保存為文件。

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

return err

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

return err

}

完整代碼實(shí)現(xiàn):

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

}

關(guān)于“golang怎么實(shí)現(xiàn)截圖功能”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

新聞標(biāo)題:golang怎么實(shí)現(xiàn)截圖功能
文章URL:http://aaarwkj.com/article30/gpiepo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、網(wǎng)頁設(shè)計(jì)公司微信小程序、服務(wù)器托管、品牌網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)
国内精品免费视频不卡| 久久亚洲综合精品少妇| 国产一级二级三级大胆视频| 六月丁香花五月婷婷| 久久亚洲精品1区2区| 国产精品盗摄一区二区三区| 国产综合欧美日韩在线91| 日本加勒比中文在线观看| 婷婷国产成人久久精品激情| 成人看片亚欧大片在线观看 | 欧美日韩福利一区二区三区| 五月婷婷六月丁香综合激情| 人妻中出中文字幕一区| 欧美日韩一区二区三区久久精品| 日韩免费系列一区二区| 少妇激情一区二区三区免费视频 | 久久九九亚洲欧美中文字幕| 精品久久久久久蜜臀av| 精品国产一区二区三区av在线| 粉嫩极品国产在线观看| 高潮内射一区二区三区| 亚洲中文字幕一区二区人妻| 亚洲国产日韩一区二区在线| 亚洲第一女人天堂av| 蜜桃网站视频免费观看| 欧美一区二区男人天堂| 国产精品欧美日韩高清| 综合激情四射亚洲激情| 不卡的视频在线观看| 日日添夜夜添天天操| 亚洲性视频日韩性视频| 天堂av影片在线观看| 国产亚洲中文字幕无线乱码 | 亚洲欧美日韩1区2区| 日韩精品有码在线视频免费观看| 色人阁在线精品免费视频| 国产91久久精品一区二区| 深夜十八禁在线免费观看| 精品亚洲一区二区在线| 日韩欧美一区二区免费| 青青草手机在线视频免费观看|