Files
imageutils/cmd/mesh/mesh.go
2025-12-14 06:04:57 +03:00

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