FreeType库(http://www.freetype.org/)是一个完全免费(开源)的、高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,包括TrueType, OpenType, Type1, CID, CFF, Windows FON/FNT, X11 PCF等。支持单色位图、反走样位图的渲染。

     freetype-go就是用go语言实现了FreeType驱动。它的项目地址: https://code.google.com/p/freetype-go

下面是使用它绘制的一个字体效果图:

相关代码:

  1. 1: package main

  1. 2: 

  1. 3: import (

  1. 4: "code.google.com/p/freetype-go/freetype"

  1. 5: "fmt"

  1. 6: "image"

  1. 7: "image/color"

  1. 8: "image/png"

  1. 9: "io/ioutil"

  1. 10: "log"

  1. 11: "os"

  1. 12: )

  1. 13: 

  1. 14: const (

  1. 15: dx = 100 // 图片的大小 宽度

  1. 16: dy = 40 // 图片的大小 高度

  1. 17: fontFile = "RAVIE.TTF" // 需要使用的字体文件

  1. 18: fontSize = 20 // 字体尺寸

  1. 19: fontDPI = 72 // 屏幕每英寸的分辨率

  1. 20: )

  1. 21: 

  1. 22: func main() {

  1. 23: 

  1. 24: // 需要保存的文件

  1. 25: imgcounter := 123

  1. 26: imgfile, _ := os.Create(fmt.Sprintf("%03d.png", imgcounter))

  1. 27: defer imgfile.Close()

  1. 28: 

  1. 29: // 新建一个 指定大小的 RGBA位图

  1. 30: img := image.NewNRGBA(image.Rect(0, 0, dx, dy))

  1. 31: 

  1. 32: // 画背景

  1. 33: for y := 0; y < dy; y++ {

  1. 34: for x := 0; x < dx; x++ {

  1. 35: // 设置某个点的颜色,依次是 RGBA

  1. 36: img.Set(x, y, color.RGBA{uint8(x), uint8(y), 0, 255})

  1. 37: }

  1. 38: }

  1. 39: 

  1. 40: // 读字体数据

  1. 41: fontBytes, err := ioutil.ReadFile(fontFile)

  1. 42: if err != nil {

  1. 43: log.Println(err)

  1. 44: return

  1. 45: }

  1. 46: font, err := freetype.ParseFont(fontBytes)

  1. 47: if err != nil {

  1. 48: log.Println(err)

  1. 49: return

  1. 50: }

  1. 51: 

  1. 52: c := freetype.NewContext()

  1. 53: c.SetDPI(fontDPI)

  1. 54: c.SetFont(font)

  1. 55: c.SetFontSize(fontSize)

  1. 56: c.SetClip(img.Bounds())

  1. 57: c.SetDst(img)

  1. 58: c.SetSrc(image.White)

  1. 59: 

  1. 60: pt := freetype.Pt(10, 10+int(c.PointToFix32(fontSize)>>8)) // 字出现的位置

  1. 61: 

  1. 62: _, err = c.DrawString("ABCDE", pt)

  1. 63: if err != nil {

  1. 64: log.Println(err)

  1. 65: return

  1. 66: }

  1. 67: 

  1. 68: // 以PNG格式保存文件

  1. 69: err = png.Encode(imgfile, img)

  1. 70: if err != nil {

  1. 71: log.Fatal(err)

  1. 72: }

  1. 73: 

  1. 74: }

Golang 使用FreeType-go进行字体的更多相关文章

  1. 使用FreeType实现矢量字体的粗体、斜体、描边、阴影效果

    前言: Freetype是一个跨平台.开源的字体渲染器,网上很多文章介绍,本人就不啰嗦了.本文重点在于实现文章标题所属的各种效果,不是Freetype的基本使用方法介绍文档,所以对于Freetype不 ...

  2. LOG.ZS.0001.基于Freetype的游戏字体渲染优化思路

    Total Utf8-ucs2 Html_parse Layout Render_string Init_texture Ft_load_glyph 原始 2293 1 26 708 1556 2 1 ...

  3. NeHe OpenGL教程 第四十三课:FreeType库

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  4. freetype 字形解析

    目录 freetype 字形解析 字体管理 数据结构 字体抽象 title: freetype 字形解析 date: 2019/3/7 20:17:46 toc: true --- freetype ...

  5. OpenGL字体绘制

    /* glfont.hpp sdragonx 2019-08-15 00:03:33 opengl字体类,提供初学者参考学习 opengl初始化之后,创建字体 font.init(L"微软雅 ...

  6. LAMP环境搭建教程(原创)

    学习PHP脚本编程语言之前,必须先搭建并熟悉开发环境,开发环境有很多种,例如LAMP.WAMP.MAMP等.这里我介绍一下LAMP环境的搭建,即Linux.Apache.MySQL.PHP环境. 一. ...

  7. LAMP环境搭建教程

    原文:LAMP环境搭建教程 学习PHP脚本编程语言之前,必须先搭建并熟悉开发环境,开发环境有很多种,例如LAMP.WAMP.MAMP等.这里我介绍一下LAMP环境的搭建,即Linux.Apache.M ...

  8. (转)用AGG实现高质量图形输出(四)

    AGG的字符输出 字符输出,对于AGG来说,这个功能可以处于显示流程的 不同位置.比如字体引擎可直接处于“Scanline Rasterizer”层向渲染器提供已处理完毕的扫描线,也可以处于“Vert ...

  9. (转)CentOS5.5 下搭建 PHP 环境(最佳的LAMP环境)

    本文详细阐述在 Linux 系统中搭建 PHP 环境,由于 PHP 就是由 C 语言编写的,最初也是运行在 Linux 系统中,所以Linux 是 PHP 的最佳环境. 关于本文中使用到的软件,请点击 ...

  10. Centos7+Apache2.4+php5.6+mysql5.5搭建Lamp环境——为了wordPress

    最近想搭建个人博客玩玩,挑来挑去发现口碑不错的博客程序是wordpress,简称wp.虽然是学java路线的程序员,但因入行时间太短,至今没有发现较为称手开源的博客程序,如果各位大神有好的推荐,也希望 ...

随机推荐

  1. Map-560. Subarray Sum Equals K

    Given an array of integers and an integer k, you need to find the total number of continuous subarra ...

  2. (1)RGB-D点云生成

    bin文件夹下为生成的可执行文件generate_cloud,执行时和data文件放在同一文件夹下. 图像数据来自小觅相机. src下的源码,包括generatePointCloud.cpp和CMak ...

  3. 浅谈对MVC的认识

    MVC是model(模型),view(视图),Controller(控制)的缩写. 模型层负责提供数据,和数据库相关的操作都交给模型层处理: 视图层提供交互的界面,其输出数据: 控制层负责接收各种请求 ...

  4. Android应用安全防护和逆向分析 ——apk混淆成其他语言代码

    现在很多人对于app的安全是越来越重视了,尤其是金融相关的行业,对于app的防范可是下足了功夫.各种加固,各种加密算法,层出不穷.我个人觉得,在安全技术这块,没有绝对安全的.也许今天这个技术起到了防范 ...

  5. Flask从入门到精通之Jinja2模板引擎

    我们使用一个简单的例子切入到Jinja2模板引擎,形式最简单的Jinja2模板引擎就是一个包含响应文本的文件,实例如下: <h1>Hello World!</h1> 最简单的包 ...

  6. 原来css也可以计算-calc()使用

    在浏览其他人的源代码时,看到了一个陌生的属性:width:calc(100% - 10px -10px); 出于好奇心,百度了一下,看到了以下这篇文章,http://www.w3cplus.com/c ...

  7. vue复选框选中值获取

    <div id="d5"> <p>{{box5.toString()}}</p> <input type="checkbox&q ...

  8. 【xsy1097】 拼图 构造题

    题目大意:请你使用n个图形拼成一个矩形.要求:①这每个图形都由1×1的小正方形组成,而且第i个图形由i个小正方形组成.②除了第1个和第2个图形以外,任意一个图形的所有小正方形,不都在一条直线上. 数据 ...

  9. django框架--底层架构

    目录 零.参考 一.对于web服务的理解 二.对于wsgi协议的理解 三.自定义一个简单的基于wsgi协议的web框架 四.django中的server实现 五.django中的application ...

  10. Netty核心概念(9)之Future

    1.前言 第7节讲解JAVA的线程模型中就说到了Future,并解释了为什么可以主线程可以获得线程池任务的执行后结果,变成一种同步状态.秘密就在于Java将所有的runnable和callable任务 ...