~dricottone/image2ascii

ref: f71f4386402373dca38ac2c263f74b65b93cc0c1 image2ascii/convert/resize.go -rw-r--r-- 1.7 KiB
f71f4386 — qeesung remove the useless code 6 years ago
                                                                                
9b483cdb qeesung
c6c0ddbf qeesung
9b483cdb qeesung
55dcbb9f qeesung
9b483cdb qeesung
55dcbb9f qeesung
9b483cdb qeesung
55dcbb9f qeesung
9b483cdb qeesung
c6c0ddbf qeesung
9b483cdb qeesung
55dcbb9f qeesung
c6c0ddbf qeesung
9b483cdb qeesung
e7b10cae qeesung
9b483cdb qeesung
55dcbb9f qeesung
c6c0ddbf qeesung
55dcbb9f qeesung
c6c0ddbf qeesung
55dcbb9f qeesung
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
// The resize package resize the image to expected size
// base on the ratio, for the most matched display
package convert

import (
	"github.com/mattn/go-isatty"
	"github.com/nfnt/resize"
	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 *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
	}

	// 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
	// get the fit the screen size
	if ratio == 1 &&
		options.ExpectedWidth == -1 &&
		options.ExpectedHeight == -1 &&
		options.FitScreen {
		screenWidth, screenHeight := getFitScreenSize()
		newWidth = int(screenWidth)
		newHeight = int(screenHeight)
	}

	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 getFitScreenSize() (newWidth, newHeight uint) {
	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()

	return x, y
}