You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
2.1 KiB
94 lines
2.1 KiB
package processor |
|
|
|
import ( |
|
"image" |
|
_ "image/jpeg" |
|
"image/png" |
|
|
|
_ "image/png" |
|
"os" |
|
"path/filepath" |
|
|
|
"github.com/nfnt/resize" |
|
) |
|
|
|
type DataForAscii struct { |
|
Img *image.Image |
|
Width uint |
|
Height uint |
|
Filename string |
|
} |
|
|
|
// GetImage returns image.Image from a filepath |
|
func GetImage(pathToFile string) (*image.Image, error) { |
|
file, err := os.Open(filepath.Join(pathToFile)) |
|
if err != nil { |
|
return nil, err |
|
} |
|
defer file.Close() |
|
|
|
image, _, err := image.Decode(file) |
|
if err != nil { |
|
return nil, err |
|
} |
|
|
|
return &image, nil |
|
} |
|
|
|
// SaveImage takes an image.Image and saves it to a file |
|
func SaveImage(filename string, img *image.Image) error { |
|
f, err := os.Create(filename) |
|
if err != nil { |
|
return err |
|
} |
|
defer f.Close() |
|
|
|
err = png.Encode(f, *img) |
|
if err != nil { |
|
return err |
|
} |
|
return nil |
|
} |
|
|
|
// ResizeImage takes an image.Image and returns a resized one using https://github.com/nfnt/resize |
|
func ResizeImage(img image.Image, newWidth uint, newHeight uint) image.Image { |
|
resizedImage := resize.Resize(newWidth, newHeight, img, resize.Lanczos3) |
|
return resizedImage |
|
} |
|
|
|
// GetChar returns a char from chars corresponding to the pixel brightness |
|
func GetChar(chars []string, pixelBrightness int) string { |
|
charsLen := len(chars) |
|
return chars[int((charsLen*pixelBrightness)/256)] |
|
} |
|
|
|
// ASCIIfy converts an image.Image into ASCII art |
|
func ASCIIfy(ASCIIchars []string, img *image.Image, cols, rows uint, filename string) { |
|
|
|
var resized image.Image |
|
if cols == uint(0) || rows == uint(0) { |
|
resized = *img |
|
} else { |
|
resized = ResizeImage(*img, cols, rows) |
|
} |
|
|
|
imgBounds := resized.Bounds() |
|
|
|
f, err := os.Create(filename) |
|
if err != nil { |
|
panic(err) |
|
} |
|
defer f.Close() |
|
|
|
for y := 0; y < imgBounds.Max.Y; y++ { |
|
for x := 0; x < imgBounds.Max.X; x++ { |
|
r, g, b, _ := resized.At(x, y).RGBA() |
|
r = r / 257 |
|
g = g / 257 |
|
b = b / 257 |
|
currentPixelBrightness := int((float64(0.2126)*float64(r) + float64(0.7152)*float64(g) + float64(0.0722)*float64(b))) |
|
f.Write([]byte(GetChar(ASCIIchars, currentPixelBrightness))) |
|
} |
|
f.Write([]byte("\n")) |
|
} |
|
}
|
|
|