Adds terminal unit resizing

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.
This commit is contained in:
foglar 2025-06-14 08:28:55 +02:00
parent 7bde699fc2
commit e3f9693cf6
7 changed files with 57 additions and 57 deletions

View File

@ -1,21 +1,9 @@
package main
import (
"fmt"
"whspbrd/pkg/cell_size"
"whspbrd/pkg/render_image"
)
func main() {
//render_image.RenderImage("kogami-pf-edit.jpg", 0, 3, 750, 0)
w, h, err := cell_size.GetTerminalCellSizePixels()
if err != nil {
fmt.Println("Error getting terminal cell size:", err)
return
}
width, height := cell_size.GetConsoleSize()
fmt.Println("Terminal cell size in pixels:", w, "x", h)
fmt.Println("Console size in characters:", width, "x", height)
render_image.RenderImage("kogami-pf-edit.jpg", 0, 3, 20, 0, 1)
}

View File

@ -0,0 +1,18 @@
package main
import (
"fmt"
"whspbrd/pkg/cell_size"
)
func main() {
w, h, err := cell_size.GetTerminalCellSizePixels()
if err != nil {
fmt.Println("Error getting terminal cell size:", err)
return
}
width, height := cell_size.GetConsoleSize()
fmt.Println("Terminal cell size in pixels:", w, "x", h)
fmt.Println("Console size in characters:", width, "x", height)
}

9
go.mod
View File

@ -3,20 +3,11 @@ module whspbrd
go 1.24.2
require (
github.com/getlantern/systray v1.2.2
github.com/jroimartin/gocui v0.5.0
golang.org/x/sys v0.30.0
)
require (
github.com/getlantern/context v0.0.0-20190109183933-c447772a6520 // indirect
github.com/getlantern/errors v0.0.0-20190325191628-abdb3e3e36f7 // indirect
github.com/getlantern/golog v0.0.0-20190830074920-4ef2e798c2d7 // indirect
github.com/getlantern/hex v0.0.0-20190417191902-c6586a6fe0b7 // indirect
github.com/getlantern/hidden v0.0.0-20190325191715-f02dbb02be55 // indirect
github.com/getlantern/ops v0.0.0-20190325191751-d70cb0d6f85f // indirect
github.com/go-stack/stack v1.8.0 // indirect
github.com/mattn/go-runewidth v0.0.9 // indirect
github.com/nsf/termbox-go v1.1.1 // indirect
github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c // indirect
)

31
go.sum
View File

@ -1,39 +1,8 @@
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/getlantern/context v0.0.0-20190109183933-c447772a6520 h1:NRUJuo3v3WGC/g5YiyF790gut6oQr5f3FBI88Wv0dx4=
github.com/getlantern/context v0.0.0-20190109183933-c447772a6520/go.mod h1:L+mq6/vvYHKjCX2oez0CgEAJmbq1fbb/oNJIWQkBybY=
github.com/getlantern/errors v0.0.0-20190325191628-abdb3e3e36f7 h1:6uJ+sZ/e03gkbqZ0kUG6mfKoqDb4XMAzMIwlajq19So=
github.com/getlantern/errors v0.0.0-20190325191628-abdb3e3e36f7/go.mod h1:l+xpFBrCtDLpK9qNjxs+cHU6+BAdlBaxHqikB6Lku3A=
github.com/getlantern/golog v0.0.0-20190830074920-4ef2e798c2d7 h1:guBYzEaLz0Vfc/jv0czrr2z7qyzTOGC9hiQ0VC+hKjk=
github.com/getlantern/golog v0.0.0-20190830074920-4ef2e798c2d7/go.mod h1:zx/1xUUeYPy3Pcmet8OSXLbF47l+3y6hIPpyLWoR9oc=
github.com/getlantern/hex v0.0.0-20190417191902-c6586a6fe0b7 h1:micT5vkcr9tOVk1FiH8SWKID8ultN44Z+yzd2y/Vyb0=
github.com/getlantern/hex v0.0.0-20190417191902-c6586a6fe0b7/go.mod h1:dD3CgOrwlzca8ed61CsZouQS5h5jIzkK9ZWrTcf0s+o=
github.com/getlantern/hidden v0.0.0-20190325191715-f02dbb02be55 h1:XYzSdCbkzOC0FDNrgJqGRo8PCMFOBFL9py72DRs7bmc=
github.com/getlantern/hidden v0.0.0-20190325191715-f02dbb02be55/go.mod h1:6mmzY2kW1TOOrVy+r41Za2MxXM+hhqTtY3oBKd2AgFA=
github.com/getlantern/ops v0.0.0-20190325191751-d70cb0d6f85f h1:wrYrQttPS8FHIRSlsrcuKazukx/xqO/PpLZzZXsF+EA=
github.com/getlantern/ops v0.0.0-20190325191751-d70cb0d6f85f/go.mod h1:D5ao98qkA6pxftxoqzibIBBrLSUli+kYnJqrgBf9cIA=
github.com/getlantern/systray v1.2.2 h1:dCEHtfmvkJG7HZ8lS/sLklTH4RKUcIsKrAD9sThoEBE=
github.com/getlantern/systray v1.2.2/go.mod h1:pXFOI1wwqwYXEhLPm9ZGjS2u/vVELeIgNMY5HvhHhcE=
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/jroimartin/gocui v0.5.0 h1:DCZc97zY9dMnHXJSJLLmx9VqiEnAj0yh0eTNpuEtG/4=
github.com/jroimartin/gocui v0.5.0/go.mod h1:l7Hz8DoYoL6NoYnlnaX6XCNR62G7J5FfSW5jEogzaxE=
github.com/lxn/walk v0.0.0-20210112085537-c389da54e794/go.mod h1:E23UucZGqpuUANJooIbHWCufXvOcT6E7Stq81gU+CSQ=
github.com/lxn/win v0.0.0-20210218163916-a377121e959e/go.mod h1:KxxjdtRkfNoYDCUP5ryK7XJJNTnpC8atvtmTheChOtk=
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/nsf/termbox-go v1.1.1 h1:nksUPLCb73Q++DwbYUBEglYBRPZyoXJdrj5L+TkjyZY=
github.com/nsf/termbox-go v1.1.1/go.mod h1:T0cTdVuOwf7pHQNtfhnEbzHbcNyCEcVU4YPpouCbVxo=
github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c h1:rp5dCmg/yLR3mgFuSOe4oEnDDmGLROTvMragMUXpTQw=
github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c/go.mod h1:X07ZCGwUbLaax7L0S3Tw4hpejzu63ZrrQiUe6W0hcy0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
gopkg.in/Knetic/govaluate.v3 v3.0.0/go.mod h1:csKLBORsPbafmSCGTEh3U7Ozmsuq8ZSIlKk1bcqph0E=

View File

@ -83,7 +83,7 @@ func updateChatView(v *gocui.View) {
//}
// Print image directly to terminal (stdout)
render_image.RenderImage("kogami-rounded.png", i*3+2, 23, 50, 50)
render_image.RenderImage("kogami-rounded.png", i*3+2, 23, 50, 50, 0)
//err = kittyimg.Fprintln(os.Stdout, img)
//if err != nil {
// log.Println("Error rendering image:", err)

View File

@ -5,6 +5,8 @@ import (
"fmt"
"image"
"image/draw"
_ "image/jpeg"
_ "image/png"
"os"
"whspbrd/pkg/resize_image"
@ -30,7 +32,7 @@ func encodeImageToBase64RGBA(rgba *image.RGBA) string {
return base64.StdEncoding.EncodeToString(rgba.Pix)
}
func RenderImage(filepath string, row int, col int, width_ int, height_ int) {
func RenderImage(filepath string, row int, col int, width_ int, height_ int, units int) {
img, err := LoadImage(filepath)
if err != nil {
fmt.Printf("Error loading image: %v\n", err)
@ -38,7 +40,11 @@ func RenderImage(filepath string, row int, col int, width_ int, height_ int) {
}
rgba := convertToRGBA(img)
rgba, _ = resize_image.Resize(*rgba, width_, height_)
if units == 1 {
rgba, _ = resize_image.ResizeInTerminal(*rgba, width_, height_)
} else {
rgba, _ = resize_image.Resize(*rgba, width_, height_)
}
encoded := encodeImageToBase64RGBA(rgba)
width := rgba.Rect.Dx()

View File

@ -3,6 +3,7 @@ package resize_image
import (
"image"
"image/color"
"whspbrd/pkg/cell_size"
)
func Resize(img image.RGBA, width int, height int) (*image.RGBA, error) {
@ -34,7 +35,34 @@ func Resize(img image.RGBA, width int, height int) (*image.RGBA, error) {
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
}