44 "bytes"
55 "fmt"
66 "image"
7+ "image/color/palette"
8+ "image/draw"
79 "io"
810 "net/http"
911 "os"
@@ -15,6 +17,10 @@ import (
1517
1618 ascii "github.com/qeesung/image2ascii/convert"
1719
20+ _ "image/gif"
21+ _ "image/jpeg"
22+ _ "image/png"
23+
1824 _ "golang.org/x/image/bmp"
1925 _ "golang.org/x/image/riff"
2026 _ "golang.org/x/image/tiff"
@@ -23,7 +29,7 @@ import (
2329 _ "golang.org/x/image/webp"
2430)
2531
26- func PrintImageFile (imageFileName string ) error {
32+ func PrintImageFile (imageFileName string , forceASCII bool ) error {
2733 imageFile , imageSize , err := util .FileAndStat (imageFileName )
2834 if err != nil {
2935 return err
@@ -39,10 +45,10 @@ func PrintImageFile(imageFileName string) error {
3945 if err != nil {
4046 return err
4147 }
42- return PrintImage (img , imageFileName , imageSize )
48+ return PrintImage (img , imageFileName , imageSize , forceASCII )
4349}
4450
45- func PrintImageURL (imageURL string ) error {
51+ func PrintImageURL (imageURL string , forceASCII bool ) error {
4652 client := http.Client {
4753 Timeout : 5 * time .Second ,
4854 }
@@ -62,11 +68,17 @@ func PrintImageURL(imageURL string) error {
6268 if err != nil {
6369 return err
6470 }
65- return PrintImage (img , imageURL , resp .ContentLength )
71+ return PrintImage (img , imageURL , resp .ContentLength , forceASCII )
6672}
6773
68- func PrintImage (img * image.Image , filename string , imageSize int64 ) error {
74+ func PrintImage (img * image.Image , filename string , imageSize int64 , forceASCII bool ) error {
6975 var img2 image.Image = * img
76+
77+ if forceASCII {
78+ fmt .Print ("\n " , ConvertToASCII (img2 ))
79+ return nil
80+ }
81+
7082 sixelCapable , _ := rasterm .IsSixelCapable ()
7183
7284 _ , _ , pw , ph := TermSize () // Get terminal height and width in pixels
@@ -94,19 +106,13 @@ func PrintImage(img *image.Image, filename string, imageSize int64) error {
94106 return rasterm .ItermWriteImage (os .Stdout , img2 )
95107
96108 case sixelCapable :
97- // TODO: Convert image to a paletted format
98- // if iPaletted, bOK := img.(*image.Paletted); bOK {
99- // return rasterm.SixelWriteImage(os.Stdout, iPaletted)
100- // } else {
101- // fmt.Println("[NOT PALETTED, SKIPPING.]")
102- // return nil
103- // }
109+ // Convert image to a paletted format
110+ palettedImg := ConvertToPaletted (img2 )
111+ return rasterm .SixelWriteImage (os .Stdout , palettedImg )
104112
105113 default :
106114 // Ascii art fallback
107- converter := ascii .NewImageConverter ()
108- convertOptions := ascii .DefaultOptions
109- fmt .Print ("\n " , converter .Image2ASCIIString (img2 , & convertOptions )) // Align image at the initial position instead of \n first?
115+ fmt .Print ("\n " , ConvertToASCII (img2 )) // Align image at the initial position instead of \n first?
110116 }
111117 return nil
112118}
@@ -119,3 +125,19 @@ func DecodeImage(imageData []byte) (*image.Image, error) {
119125 }
120126 return & image , nil
121127}
128+
129+ // ConvertToPaletted converts an image.Image to an image.Paletted
130+ // Needed for Sixel conversion
131+ func ConvertToPaletted (img image.Image ) * image.Paletted {
132+ bounds := img .Bounds ()
133+ palettedImg := image .NewPaletted (bounds , palette .Plan9 )
134+ draw .Draw (palettedImg , bounds , img , bounds .Min , draw .Over )
135+ return palettedImg
136+ }
137+
138+ // ASCII art conversion
139+ func ConvertToASCII (img image.Image ) string {
140+ converter := ascii .NewImageConverter ()
141+ convertOptions := ascii .DefaultOptions
142+ return converter .Image2ASCIIString (img , & convertOptions )
143+ }
0 commit comments