// Text takes an image and, using the freetype package, writes text in the // position specified on to the image. A color.Color, a font size and a font // must also be specified. // Finally, the (x, y) coordinate advanced by the text extents is returned. // // Note that the ParseFont helper function can be used to get a *truetype.Font // value without having to import freetype-go directly. // // If you need more control over the 'context' used to draw text (like the DPI), // then you'll need to ignore this convenience method and use your own. func (im *Image) Text(x, y int, clr color.Color, fontSize float64, font *truetype.Font, text string) (int, int, error) { // Create a solid color image textClr := image.NewUniform(clr) // Set up the freetype context... mostly boiler plate c := ftContext(font, fontSize) c.SetClip(im.Bounds()) c.SetDst(im) c.SetSrc(textClr) // Now let's actually draw the text... pt := freetype.Pt(x, y+int(c.PointToFix32(fontSize)>>8)) newpt, err := c.DrawString(text, pt) if err != nil { return 0, 0, err } return int(newpt.X / 256), int(newpt.Y / 256), nil }
func main() { flag.Parse() // Read the font data. fontBytes, err := ioutil.ReadFile(*fontfile) if err != nil { log.Println(err) return } font, err := freetype.ParseFont(fontBytes) if err != nil { log.Println(err) return } // Initialize the context. fg, bg := image.Black, image.White ruler := color.RGBA{0xdd, 0xdd, 0xdd, 0xff} if *wonb { fg, bg = image.White, image.Black ruler = color.RGBA{0x22, 0x22, 0x22, 0xff} } rgba := image.NewRGBA(image.Rect(0, 0, 640, 480)) draw.Draw(rgba, rgba.Bounds(), bg, image.ZP, draw.Src) c := freetype.NewContext() c.SetDPI(*dpi) c.SetFont(font) c.SetFontSize(*size) c.SetClip(rgba.Bounds()) c.SetDst(rgba) c.SetSrc(fg) // Draw the guidelines. for i := 0; i < 200; i++ { rgba.Set(10, 10+i, ruler) rgba.Set(10+i, 10, ruler) } // Draw the text. pt := freetype.Pt(10, 10+int(c.PointToFix32(*size)>>8)) for _, s := range text { _, err = c.DrawString(s, pt) if err != nil { log.Println(err) return } pt.Y += c.PointToFix32(*size * *spacing) } // Save that RGBA image to disk. f, err := os.Create("out.png") if err != nil { log.Println(err) os.Exit(1) } defer f.Close() b := bufio.NewWriter(f) err = png.Encode(b, rgba) if err != nil { log.Println(err) os.Exit(1) } err = b.Flush() if err != nil { log.Println(err) os.Exit(1) } fmt.Println("Wrote out.png OK.") }