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
// The resize package resize the image to expected size
// base on the ratio, for the most matched display
package resize
import (
"github.com/mattn/go-isatty"
"github.com/nfnt/resize"
"github.com/qeesung/image2ascii/convert"
terminal "github.com/wayneashleyberry/terminal-dimensions"
"image"
"log"
"os"
"runtime"
)
// Resize the convert to expected size base on the ratio
func ScaleImage(image image.Image, options *convert.Options) (newImage image.Image) {
sz := image.Bounds()
ratio := options.Ratio
newHeight := sz.Max.X
newWidth := sz.Max.Y
if options.ExpectedWidth != -1 {
newWidth = options.ExpectedWidth
}
if options.ExpectedHeight != -1 {
newHeight = options.ExpectedHeight
}
// get the fit the screen size
if ratio == 1 &&
options.ExpectedWidth == -1 &&
options.ExpectedHeight == -1 &&
options.FitScreen {
ratio = getFitScreenRatio(uint(newWidth), uint(newHeight))
}
// use the ratio the scale the image
if options.ExpectedHeight == -1 && options.ExpectedWidth == -1 && ratio != 1 {
newWidth = int(float64(sz.Max.X) * ratio)
newHeight = int(float64(sz.Max.Y) * ratio * charWidth())
}
// fit the screen
newImage = resize.Resize(uint(newWidth), uint(newHeight), image, resize.Lanczos3)
return
}
// Get the terminal char width on different system
func charWidth() float64 {
if isWindows() {
return 0.714
} else {
return 0.5
}
}
// Check if current system is windows
func isWindows() bool {
return runtime.GOOS == "windows"
}
func getFitScreenRatio(imageWidth, imageHeight uint) float64 {
if !isatty.IsTerminal(os.Stdout.Fd()) || !isatty.IsCygwinTerminal(os.Stdout.Fd()) {
log.Fatal("Can not detect the terminal, please disable the '-s fitScreen' option")
}
x, _ := terminal.Width()
y, _ := terminal.Height()
verticalRatio := float64(y / imageHeight)
horizontalRatio := float64(x / imageWidth)
if verticalRatio > horizontalRatio {
return horizontalRatio
} else {
return verticalRatio
}
}