/
screenshot.go
88 lines (73 loc) · 2.45 KB
/
screenshot.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package easygif
import (
"fmt"
"image"
"time"
"github.com/vova616/screenshot"
)
func Screenshot() (image.Image, error) {
img, err := screenshot.CaptureScreen()
if err != nil {
return nil, fmt.Errorf("TakeScreenshot(), error while getting screenshot: %w", err)
}
return img, nil
}
func ScreenshotTrimmed(leftTrim, rightTrim, topTrim, bottomTrim int) (image.Image, error) {
captureRec, err := getTrimmedRectangle(leftTrim, rightTrim, topTrim, bottomTrim)
if err != nil {
return nil, fmt.Errorf("TakeScreenshot(): %w", err)
}
img, err := screenshot.CaptureRect(captureRec)
if err != nil {
return nil, fmt.Errorf("TakeScreenshot(), error while getting screenshot: %w", err)
}
return img, nil
}
func getTrimmedRectangle(leftTrim, rightTrim, topTrim, bottomTrim int) (image.Rectangle, error) {
if leftTrim < 0 || rightTrim < 0 || topTrim < 0 || bottomTrim < 0 {
return image.Rectangle{}, fmt.Errorf("getTrimmedRectangle(), all trim values must be >= 0")
}
screenRec, err := screenshot.ScreenRect()
if err != nil {
return image.Rectangle{}, fmt.Errorf("getTrimmedRectangle(), error while getting ScreenRect: %w", err)
}
totalTrimX := leftTrim + rightTrim
totalTrimY := topTrim + bottomTrim
if totalTrimX >= screenRec.Dx() || totalTrimY >= screenRec.Dy() {
return image.Rectangle{}, fmt.Errorf("getTrimmedRectangle(), total trim is larger than screen size")
}
captureRec := screenRec
captureRec.Min.X += leftTrim
captureRec.Max.X -= rightTrim
captureRec.Min.Y += topTrim
captureRec.Max.Y -= bottomTrim
return captureRec, nil
}
func ScreenshotVideo(
frameCount int,
delayBetweenScreenshots time.Duration,
) ([]image.Image, error) {
return ScreenshotVideoTrimmed(frameCount, delayBetweenScreenshots, 0, 0, 0, 0)
}
func ScreenshotVideoTrimmed(
frameCount int,
delayBetweenScreenshots time.Duration,
leftTrim, rightTrim, topTrim, bottomTrim int,
) ([]image.Image, error) {
//
captureRec, err := getTrimmedRectangle(leftTrim, rightTrim, topTrim, bottomTrim)
if err != nil {
return nil, fmt.Errorf("ScreenshotVideoTrimmed(): %w", err)
}
frames := make([]image.Image, frameCount)
nextTime := time.Now()
for frameIndex := 0; frameIndex < frameCount; frameIndex++ {
frames[frameIndex], err = screenshot.CaptureRect(captureRec)
if err != nil {
return nil, fmt.Errorf("TakeScreenshot(), error while getting screenshot: %w", err)
}
nextTime = nextTime.Add(delayBetweenScreenshots)
time.Sleep(time.Until(nextTime))
}
return frames, nil
}