92 lines
1.8 KiB
Go
92 lines
1.8 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"image"
|
|
"image/color"
|
|
"image/draw"
|
|
"image/png"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/golang/freetype/truetype"
|
|
"golang.org/x/image/font"
|
|
"golang.org/x/image/font/gofont/gomono"
|
|
"golang.org/x/image/math/fixed"
|
|
// "github.com/droyo/styx"
|
|
// "io/fs"
|
|
)
|
|
|
|
type Mesh struct {
|
|
image.Image
|
|
X, Y int // divide
|
|
}
|
|
|
|
// using source's color.Model
|
|
func (mesh Mesh) ColorModel() color.Model { return mesh.Image.ColorModel() }
|
|
|
|
// using source's image.Rectangle
|
|
func (mesh Mesh) Bounds() image.Rectangle { return mesh.Image.Bounds() }
|
|
func (mesh Mesh) At(x, y int) color.Color {
|
|
dx, dy := mesh.Image.Bounds().Dx(), mesh.Image.Bounds().Dy()
|
|
if (x%(dx/mesh.X)) == 0 || (y%(dy/mesh.Y)) == 0 {
|
|
return color.Black
|
|
}
|
|
return mesh.Image.At(x, y)
|
|
}
|
|
|
|
func render(img image.Image) draw.Image {
|
|
dst := image.NewRGBA(img.Bounds())
|
|
draw.Draw(dst, dst.Bounds(), img, image.Point{}, draw.Src)
|
|
return dst
|
|
}
|
|
|
|
func main() {
|
|
// x := flag.Int("x", 2, "use to grid by x axis")
|
|
// y := flag.Int("y", 2, "use to grid by y axis")
|
|
flag.Parse() // now flags is ready to use
|
|
|
|
img, err := png.Decode(os.Stdin)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
// Mesh{ // our image modifyer
|
|
// Image: img,
|
|
// X: *x,
|
|
// Y: *y,
|
|
// },
|
|
|
|
dst := render(
|
|
img,
|
|
)
|
|
|
|
f, err := truetype.Parse(gomono.TTF)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
face := truetype.NewFace(f, &truetype.Options{
|
|
Size: float64(img.Bounds().Dx() / 19),
|
|
DPI: 72,
|
|
Hinting: font.HintingNone,
|
|
})
|
|
|
|
d := &font.Drawer{
|
|
Dst: dst,
|
|
Src: image.NewUniform(color.Black),
|
|
Face: face,
|
|
Dot: fixed.Point26_6{fixed.Int26_6(img.Bounds().Dx() /
|
|
9*64,
|
|
),
|
|
fixed.Int26_6(img.Bounds().Dy() /
|
|
5*64,
|
|
),
|
|
},
|
|
}
|
|
d.DrawString(time.Now().Format(time.Kitchen))
|
|
|
|
err = png.Encode(os.Stdout, dst)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|