Improves image rendering by allowing resizing based on terminal cell size, providing more control over image dimensions. This is enabled by a new `units` parameter where 0 defaults to the previous pixel sizing and 1 enables terminal unit sizing. Removes unused dependency.
69 lines
1.6 KiB
Go
69 lines
1.6 KiB
Go
package resize_image
|
|
|
|
import (
|
|
"image"
|
|
"image/color"
|
|
"whspbrd/pkg/cell_size"
|
|
)
|
|
|
|
func Resize(img image.RGBA, width int, height int) (*image.RGBA, error) {
|
|
originalWidth := img.Bounds().Dx()
|
|
originalHeight := img.Bounds().Dy()
|
|
|
|
if width <= 0 && height <= 0 {
|
|
return nil, nil
|
|
} else if width <= 0 {
|
|
width = int(float64(height) * float64(originalWidth) / float64(originalHeight))
|
|
} else if height <= 0 {
|
|
height = int(float64(width) * float64(originalHeight) / float64(originalWidth))
|
|
}
|
|
|
|
newImg := image.NewRGBA(image.Rect(0, 0, width, height))
|
|
scaleX := float64(originalWidth) / float64(width)
|
|
scaleY := float64(originalHeight) / float64(height)
|
|
|
|
for y := 0; y < height; y++ {
|
|
for x := 0; x < width; x++ {
|
|
srcX := int(float64(x) * scaleX)
|
|
srcY := int(float64(y) * scaleY)
|
|
|
|
r, g, b, a := getPixel(img, srcX, srcY)
|
|
newImg.Set(x, y, color.RGBA{r, g, b, a})
|
|
}
|
|
}
|
|
|
|
return newImg, nil
|
|
}
|
|
|
|
func ResizeInTerminal(img image.RGBA, columns int, rows int) (*image.RGBA, error) {
|
|
if columns <= 0 && rows <= 0 {
|
|
return nil, nil
|
|
}
|
|
|
|
width := convertColumnsToPixels(columns)
|
|
height := convertRowsToPixels(rows)
|
|
|
|
return Resize(img, width, height)
|
|
}
|
|
|
|
func getPixel(img image.RGBA, x int, y int) (uint8, uint8, uint8, uint8) {
|
|
index := img.PixOffset(x, y)
|
|
return img.Pix[index], img.Pix[index+1], img.Pix[index+2], img.Pix[index+3]
|
|
}
|
|
|
|
func convertColumnsToPixels(columns int) int {
|
|
w, _, err := cell_size.GetTerminalCellSizePixels()
|
|
if err != nil {
|
|
w = 8
|
|
}
|
|
return columns * w
|
|
}
|
|
|
|
func convertRowsToPixels(rows int) int {
|
|
_, h, err := cell_size.GetTerminalCellSizePixels()
|
|
if err != nil {
|
|
h = 16
|
|
}
|
|
return rows * h
|
|
}
|