把文字绘制到图片上

24802117 · 2018-03-20 19:47:55 · 5273 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-03-20 19:47:55 的主题,其中的信息可能已经有所发展或是发生改变。

这次遇到个项目,需要把文字绘制到图片上,然后还要加描边,官方有个freetype的支持,可以直接实现文字绘制到图片上 地址是:https://github.com/golang/freetype

可是这个我没有找到描边那些,本来准备用绘图的方法绘制上去的,结果发现太麻烦了,最后自己重新用C++编译调用Freetype库底层来实现了这一功能,未来准备添加一些其他的自定义的相关方法,希望大家体验并提交意见。 同时也希望能帮助到有需求的朋友。

项目地址:https://github.com/NiuStar/DrawFont

示例代码:

package main

import (
    "bufio"
    "flag"
    "fmt"
    "image/png"
    "log"
    "os"
    "image/color"
    "github.com/NiuStar/DrawFont"
    "image"
    "image/draw"
)

var (
    dpi      = flag.Float64("dpi", 72, "screen resolution in Dots Per Inch")
    fontfile = flag.String("fontfile", "./wryhBold.ttf", "filename of the ttf font")
    hinting  = flag.String("hinting", "none", "none | full")
    size     = flag.Float64("size", 280, "font size in points")
    outLineSize     = flag.Float64("outLineSize", 10, "font size in points")
    spacing  = flag.Float64("spacing", 1.5, "line spacing (e.g. 2 means double spaced)")
    wonb     = flag.Bool("whiteonblack", false, "white text on a black background")
)

var text = []string{
    "欢迎",
    "四川不知道啥的信息化中心",
    "某一个一行",
    "莅临参观指导",

}
func main() {

    b1,err := os.Open("background.png")

    if err != nil {
        panic(err)
    }

    rgba,_, err := image.Decode(b1)
    if err != nil {
        panic(err)
    }

    font := DrawFont.NewDrawFont("./wryhBold.ttf")

    whiteG := color.RGBA{0xff,0xff,0xff,0xff}
    yellowG := color.RGBA{0xff,241,0,0xff}
    outG := color.RGBA{27,91,97,0xff}


    for index, s := range text {

        var f *image.RGBA
        if index == 0 || index == (len(text) - 1) {
            f = font.DrawStringWithOutLine(s,whiteG,outG,220,20.0)
        } else {
            f = font.DrawStringWithOutLine(s,yellowG,outG,220,20.0)
        }

        pt := image.Pt(int((rgba.Bounds().Dx()- f.Bounds().Dx())/2),
            int((rgba.Bounds().Dy()-(f.Bounds().Dy() / 5 + f.Bounds().Dy())*(len(text)-index*int(2)) )/2))

        sr := f.Bounds()         // 获取要复制图片的尺寸
        r := sr.Sub(sr.Min).Add(pt)   // 目标图的要剪切区域

        draw.Draw(rgba.(draw.Image), r, f, sr.Min, draw.Over)
    }
    font.FreeDraw()

    // 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.")

}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

5273 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传