67 lines
1.3 KiB
Go
67 lines
1.3 KiB
Go
package term_image
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"fmt"
|
|
"image"
|
|
"image/draw"
|
|
"os"
|
|
)
|
|
|
|
func LoadImage(filePath string) (image.Image, error) {
|
|
f, err := os.Open(filePath)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer f.Close()
|
|
img, _, err := image.Decode(f)
|
|
return img, err
|
|
}
|
|
|
|
func convertToRGBA(img image.Image) *image.RGBA {
|
|
rgba := image.NewRGBA(img.Bounds())
|
|
draw.Draw(rgba, rgba.Bounds(), img, image.Point{0, 0}, draw.Src)
|
|
return rgba
|
|
}
|
|
|
|
func encodeImageToBase64RGBA(rgba *image.RGBA) string {
|
|
return base64.StdEncoding.EncodeToString(rgba.Pix)
|
|
}
|
|
|
|
func RenderImage(filepath string, row int, col int) {
|
|
img, err := LoadImage(filepath)
|
|
if err != nil {
|
|
fmt.Printf("Error loading image: %v\n", err)
|
|
return
|
|
}
|
|
|
|
rgba := convertToRGBA(img)
|
|
encoded := encodeImageToBase64RGBA(rgba)
|
|
|
|
width := rgba.Rect.Dx()
|
|
height := rgba.Rect.Dy()
|
|
|
|
fmt.Printf("\033[s\033[%d;%dH", row, col)
|
|
|
|
chunkSize := 4096
|
|
pos := 0
|
|
first := true
|
|
for pos < len(encoded) {
|
|
fmt.Print("\033_G")
|
|
if first {
|
|
fmt.Printf("q=2,a=T,f=32,s=%d,v=%d,", width, height)
|
|
first = false
|
|
}
|
|
chunkLen := len(encoded) - pos
|
|
if chunkLen > chunkSize {
|
|
chunkLen = chunkSize
|
|
}
|
|
if pos+chunkLen < len(encoded) {
|
|
fmt.Print("m=1")
|
|
}
|
|
fmt.Printf(";%s\033\\", encoded[pos:pos+chunkLen])
|
|
pos += chunkLen
|
|
}
|
|
fmt.Print("\033[u")
|
|
}
|