◊ A tool for creating a sequence of ascii text files from given video using FFMPEG ◊
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.

95 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"))
}
}