Golang Gin實踐 連載十六 在圖片上繪製文字

來源:互聯網
上載者:User

Golang Gin實踐 連載十六 在圖片上繪製文字

原文地址:Golang Gin實踐 連載十六 在圖片上繪製文字
項目地址:go-gin-example

前言

本章節是 連載十五 的補充內容,建議一同食用。主要實現合并後的海報上繪製文字的功能(這個需求也是常見的很了),內容比較簡單

實現

這裡使用的是 微軟雅黑 的字型,請點擊進行下載並存放到 runtime/fonts 目錄下(字型檔占 16 MB 大小)

安裝

$ go get -u github.com/golang/freetype

繪製文字

開啟 service/article_service/article_poster.go 檔案,增加繪製文字的商務邏輯,如下:

type DrawText struct {    JPG    draw.Image    Merged *os.File    Title string    X0    int    Y0    int    Size0 float64    SubTitle string    X1       int    Y1       int    Size1    float64}func (a *ArticlePosterBg) DrawPoster(d *DrawText, fontName string) error {    fontSource := setting.AppSetting.RuntimeRootPath + setting.AppSetting.FontSavePath + fontName    fontSourceBytes, err := ioutil.ReadFile(fontSource)    if err != nil {        return err    }    trueTypeFont, err := freetype.ParseFont(fontSourceBytes)    if err != nil {        return err    }    fc := freetype.NewContext()    fc.SetDPI(72)    fc.SetFont(trueTypeFont)    fc.SetFontSize(d.Size0)    fc.SetClip(d.JPG.Bounds())    fc.SetDst(d.JPG)    fc.SetSrc(image.Black)    pt := freetype.Pt(d.X0, d.Y0)    _, err = fc.DrawString(d.Title, pt)    if err != nil {        return err    }    fc.SetFontSize(d.Size1)    _, err = fc.DrawString(d.SubTitle, freetype.Pt(d.X1, d.Y1))    if err != nil {        return err    }    err = jpeg.Encode(d.Merged, d.JPG, nil)    if err != nil {        return err    }    return nil}

這裡主要使用了 freetype 包,分別涉及如下細項:

1、freetype.NewContext:建立一個新的 Context,會對其設定一些預設值

func NewContext() *Context {    return &Context{        r:        raster.NewRasterizer(0, 0),        fontSize: 12,        dpi:      72,        scale:    12 << 6,    }}

2、fc.SetDPI:設定螢幕每英寸的解析度

3、fc.SetFont:設定用於繪製文本的字型

4、fc.SetFontSize:以磅為單位設定字型大小

5、fc.SetClip:設定剪裁矩形以進行繪製

6、fc.SetDst:設定靶心圖表像

7、fc.SetSrc:設定繪製操作的源映像,通常為 image.Uniform

var (        // Black is an opaque black uniform image.        Black = NewUniform(color.Black)        // White is an opaque white uniform image.        White = NewUniform(color.White)        // Transparent is a fully transparent uniform image.        Transparent = NewUniform(color.Transparent)        // Opaque is a fully opaque uniform image.        Opaque = NewUniform(color.Opaque))

8、fc.DrawString:根據 Pt 的座標值繪製給定的常值內容

商務邏輯

開啟 service/article_service/article_poster.go 方法,在 Generate 方法增加繪製文字的代碼邏輯,如下:

func (a *ArticlePosterBg) Generate() (string, string, error) {    fullPath := qrcode.GetQrCodeFullPath()    fileName, path, err := a.Qr.Encode(fullPath)    if err != nil {        return "", "", err    }    if !a.CheckMergedImage(path) {        ...        draw.Draw(jpg, jpg.Bounds(), bgImage, bgImage.Bounds().Min, draw.Over)        draw.Draw(jpg, jpg.Bounds(), qrImage, qrImage.Bounds().Min.Sub(image.Pt(a.Pt.X, a.Pt.Y)), draw.Over)        err = a.DrawPoster(&DrawText{            JPG:    jpg,            Merged: mergedF,            Title: "Golang Gin 系列文章",            X0:    80,            Y0:    160,            Size0: 42,            SubTitle: "---煎魚",            X1:       320,            Y1:       220,            Size1:    36,        }, "msyhbd.ttc")        if err != nil {            return "", "", err        }    }    return fileName, path, nil}

驗證

訪問產生文章海報的介面 $HOST/api/v1/articles/poster/generate?token=$token,檢查其產生結果,如

總結

在本章節在 連載十五 的基礎上增加了繪製文字,在實現上並不困難,而這兩塊需求一般會同時出現,大家可以多加練習,瞭解裡面的邏輯和其他 API

參考

本系列範例程式碼

  • go-gin-example
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.