4
4
"bytes"
5
5
"fmt"
6
6
"image"
7
+ "image/color/palette"
8
+ "image/draw"
7
9
"io"
8
10
"net/http"
9
11
"os"
@@ -15,6 +17,10 @@ import (
15
17
16
18
ascii "github.com/qeesung/image2ascii/convert"
17
19
20
+ _ "image/gif"
21
+ _ "image/jpeg"
22
+ _ "image/png"
23
+
18
24
_ "golang.org/x/image/bmp"
19
25
_ "golang.org/x/image/riff"
20
26
_ "golang.org/x/image/tiff"
@@ -23,7 +29,7 @@ import (
23
29
_ "golang.org/x/image/webp"
24
30
)
25
31
26
- func PrintImageFile (imageFileName string ) error {
32
+ func PrintImageFile (imageFileName string , forceASCII bool ) error {
27
33
imageFile , imageSize , err := util .FileAndStat (imageFileName )
28
34
if err != nil {
29
35
return err
@@ -39,10 +45,10 @@ func PrintImageFile(imageFileName string) error {
39
45
if err != nil {
40
46
return err
41
47
}
42
- return PrintImage (img , imageFileName , imageSize )
48
+ return PrintImage (img , imageFileName , imageSize , forceASCII )
43
49
}
44
50
45
- func PrintImageURL (imageURL string ) error {
51
+ func PrintImageURL (imageURL string , forceASCII bool ) error {
46
52
client := http.Client {
47
53
Timeout : 5 * time .Second ,
48
54
}
@@ -62,11 +68,17 @@ func PrintImageURL(imageURL string) error {
62
68
if err != nil {
63
69
return err
64
70
}
65
- return PrintImage (img , imageURL , resp .ContentLength )
71
+ return PrintImage (img , imageURL , resp .ContentLength , forceASCII )
66
72
}
67
73
68
- func PrintImage (img * image.Image , filename string , imageSize int64 ) error {
74
+ func PrintImage (img * image.Image , filename string , imageSize int64 , forceASCII bool ) error {
69
75
var img2 image.Image = * img
76
+
77
+ if forceASCII {
78
+ fmt .Print ("\n " , ConvertToASCII (img2 ))
79
+ return nil
80
+ }
81
+
70
82
sixelCapable , _ := rasterm .IsSixelCapable ()
71
83
72
84
_ , _ , pw , ph := TermSize () // Get terminal height and width in pixels
@@ -94,19 +106,13 @@ func PrintImage(img *image.Image, filename string, imageSize int64) error {
94
106
return rasterm .ItermWriteImage (os .Stdout , img2 )
95
107
96
108
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 )
104
112
105
113
default :
106
114
// 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?
110
116
}
111
117
return nil
112
118
}
@@ -119,3 +125,19 @@ func DecodeImage(imageData []byte) (*image.Image, error) {
119
125
}
120
126
return & image , nil
121
127
}
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