在golang中与Truetype对齐文本
发布时间:2020-12-16 19:22:48 所属栏目:大数据 来源:网络整理
导读:我试图在golang项目中使用freetype / truetype在png上呈现一些文本.从附件中可以看出,我正在列中列出4个字母 – 每个字母都以列为中心.使用truetype api来获取字形的边界和宽度,但是无法将其转换为每个字形的精确偏移量.例如,使用O字形,给出我使用的字体.我
|
我试图在golang项目中使用freetype / truetype在png上呈现一些文本.从附件中可以看出,我正在列中列出4个字母 – 每个字母都以列为中心.使用truetype api来获取字形的边界和宽度,但是无法将其转换为每个字形的精确偏移量.例如,使用O字形,给出我使用的字体.我得到以下维度:
Hmetric {AdvanceWidth:543 LeftSideBearing:36} 最后一个维度从GlyphBuf返回. 我使用以下方式呈现: 大小:= 125.00 如何使用truetype返回的字形尺寸正确地抵消字母?我已经尝试使用AdvanceWidth作为详细的in this plotinum代码(第160行),但这并不能使我在所有字形之间保持一致的结果.
根据Simon的建议,正确的解决方案是使用AdvanceWidth:
粗体示例: package main
import (
"flag"
"fmt"
"io/ioutil"
"log"
"image"
"bufio"
"image/draw"
"image/png"
"image/color"
"github.com/golang/freetype/truetype"
"golang.org/x/image/font"
"github.com/golang/freetype"
"os"
)
var (
dpi = flag.Float64("dpi",72,"screen resolution in Dots Per Inch")
fontfile = flag.String("fontfile","/usr/share/fonts/liberation/LiberationSerif-Regular.ttf","filename of the ttf font")
hinting = flag.String("hinting","none","none | full")
size = flag.Float64("size",125,"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")
text = string("JOJO")
)
func main() {
flag.Parse()
fmt.Printf("Loading fontfile %qn",*fontfile)
b,err := ioutil.ReadFile(*fontfile)
if err != nil {
log.Println(err)
return
}
f,err := truetype.Parse(b)
if err != nil {
log.Println(err)
return
}
// Freetype context
fg,bg := image.Black,image.White
rgba := image.NewRGBA(image.Rect(0,1000,200))
draw.Draw(rgba,rgba.Bounds(),bg,image.ZP,draw.Src)
c := freetype.NewContext()
c.SetDPI(*dpi)
c.SetFont(f)
c.SetFontSize(*size)
c.SetClip(rgba.Bounds())
c.SetDst(rgba)
c.SetSrc(fg)
switch *hinting {
default:
c.SetHinting(font.HintingNone)
case "full":
c.SetHinting(font.HintingFull)
}
// Make some background
// Draw the guidelines.
ruler := color.RGBA{0xdd,0xdd,0xff}
for rcount := 0; rcount < 4; rcount ++ {
for i := 0; i < 200; i++ {
rgba.Set(250*rcount,i,ruler)
}
}
// Truetype stuff
opts := truetype.Options{}
opts.Size = 125.0
face := truetype.NewFace(f,&opts)
// Calculate the widths and print to image
for i,x := range(text) {
awidth,ok := face.GlyphAdvance(rune(x))
if ok != true {
log.Println(err)
return
}
iwidthf := int(float64(awidth) / 64)
fmt.Printf("%+vn",iwidthf)
pt := freetype.Pt(i*250+(125-iwidthf/2),128)
c.DrawString(string(x),pt)
fmt.Printf("%+vn",awidth)
}
// Save that RGBA image to disk.
outFile,err := os.Create("out.png")
if err != nil {
log.Println(err)
os.Exit(1)
}
defer outFile.Close()
bf := bufio.NewWriter(outFile)
err = png.Encode(bf,rgba)
if err != nil {
log.Println(err)
os.Exit(1)
}
err = bf.Flush()
if err != nil {
log.Println(err)
os.Exit(1)
}
fmt.Println("Wrote out.png OK.")
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
