func generateImage(params Params) image.Image { fgColor := white var detectedFont *truetype.Font if []rune(params.text)[0] > '\u2E7F' { detectedFont = cjkFont } else { detectedFont = defaultFont } fontSize := float64(params.size) * 0.5 img := image.NewRGBA(image.Rect(0, 0, params.size, params.size)) if params.seed != 0 { rand.Seed(params.seed) } var bgColor color.RGBA if params.color == (color.RGBA{}) { bgColor = colors[rand.Intn(len(colors))] } else { bgColor = params.color } if params.border { bgColor, fgColor = fgColor, bgColor } draw.Draw(img, img.Bounds(), &image.Uniform{bgColor}, image.ZP, draw.Src) if params.border { strokeWidth := fontSize * 0.08 circleSize := fontSize * 0.92 arcAngle := math.Pi * 2 gc := draw2dimg.NewGraphicContext(img) gc.SetStrokeColor(fgColor) gc.SetLineWidth(strokeWidth) gc.ArcTo(fontSize, fontSize, circleSize, circleSize, arcAngle, arcAngle) gc.Stroke() } d := &font.Drawer{ Dst: img, Src: image.NewUniform(fgColor), Face: truetype.NewFace(detectedFont, &truetype.Options{ Size: fontSize, DPI: 72, }), } d.Dot = fixed.Point26_6{ X: (fixed.I(params.size) - d.MeasureString(params.text)) / 2, Y: fixed.I(int(math.Ceil(fontSize * 1.35))), } d.DrawString(params.text) return img }
func main() { flag.Parse() // Read the font data. fontBytes, err := ioutil.ReadFile(*fontfile) if err != nil { log.Println(err) return } f, err := truetype.Parse(fontBytes) if err != nil { log.Println(err) return } // Draw the background and the guidelines. 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} } const imgW, imgH = 640, 480 rgba := image.NewRGBA(image.Rect(0, 0, imgW, imgH)) draw.Draw(rgba, rgba.Bounds(), bg, image.ZP, draw.Src) for i := 0; i < 200; i++ { rgba.Set(10, 10+i, ruler) rgba.Set(10+i, 10, ruler) } // Draw the text. h := font.HintingNone switch *hinting { case "full": h = font.HintingFull } d := &font.Drawer{ Dst: rgba, Src: fg, Face: truetype.NewFace(f, &truetype.Options{ Size: *size, DPI: *dpi, Hinting: h, }), } y := 10 + int(math.Ceil(*size**dpi/72)) dy := int(math.Ceil(*size * *spacing * *dpi / 72)) d.Dot = fixed.Point26_6{ X: (fixed.I(imgW) - d.MeasureString(title)) / 2, Y: fixed.I(y), } d.DrawString(title) y += dy for _, s := range text { d.Dot = fixed.P(10, y) d.DrawString(s) y += dy } // Save that RGBA image to disk. outFile, err := os.Create("out.png") if err != nil { log.Println(err) os.Exit(1) } defer outFile.Close() b := bufio.NewWriter(outFile) 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.") }