From e3f9693cf63f6511c6cec8e377d7b6c5536c87f6 Mon Sep 17 00:00:00 2001 From: foglar Date: Sat, 14 Jun 2025 08:28:55 +0200 Subject: [PATCH] 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. --- cmd/main.go | 16 ++-------------- examples/getTerminalSize.go | 18 ++++++++++++++++++ go.mod | 9 --------- go.sum | 31 ------------------------------- internal/tui/tui.go | 2 +- pkg/render_image/render_image.go | 10 ++++++++-- pkg/resize_image/resize_image.go | 28 ++++++++++++++++++++++++++++ 7 files changed, 57 insertions(+), 57 deletions(-) create mode 100644 examples/getTerminalSize.go diff --git a/cmd/main.go b/cmd/main.go index ef6f95f..9b2351b 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -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) } diff --git a/examples/getTerminalSize.go b/examples/getTerminalSize.go new file mode 100644 index 0000000..3e7ee28 --- /dev/null +++ b/examples/getTerminalSize.go @@ -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) +} diff --git a/go.mod b/go.mod index 62794e0..47e5ed9 100644 --- a/go.mod +++ b/go.mod @@ -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 ) diff --git a/go.sum b/go.sum index a5140ac..ea34a04 100644 --- a/go.sum +++ b/go.sum @@ -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= diff --git a/internal/tui/tui.go b/internal/tui/tui.go index 73bee72..f8a0913 100644 --- a/internal/tui/tui.go +++ b/internal/tui/tui.go @@ -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) diff --git a/pkg/render_image/render_image.go b/pkg/render_image/render_image.go index 497137f..ffdeb1c 100644 --- a/pkg/render_image/render_image.go +++ b/pkg/render_image/render_image.go @@ -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() diff --git a/pkg/resize_image/resize_image.go b/pkg/resize_image/resize_image.go index fdfb7b9..7093591 100644 --- a/pkg/resize_image/resize_image.go +++ b/pkg/resize_image/resize_image.go @@ -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 +}