~dricottone/image2ascii

ref: b234848fd6b7c6b6b9de6138597f7bf35d90e0dd image2ascii/convert/resize.go -rw-r--r-- 1.7 KiB
b234848f — 秦世成 Update README.md 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
}