Golang Gin実践連載16画像に文字を描く
原文住所:Golang Gin実践連載十六画像に文字を描く項目住所:go-gin-example
前言
この章は連載15の補足内容で、一緒に食べることをお勧めします.主に統合されたポスターに文字を描く機能(このニーズもよくある)を実現し、内容は比較的簡単です.
インプリメンテーション
ここではマイクロソフトの黒のフォントを使用していますので、ダウンロードしてruntime/fontsディレクトリに保存してください(フォントファイルは16 MBサイズです)
インストール
テキストの描画
サービス/articleを開くservice/article_poster.goファイルは、文字を描くビジネスロジックを追加します.以下のようにします.
ここでは主にfreetypeパッケージが使用されており、それぞれ以下の詳細に関連しています.
1、freetype.NewContext:新しいContextを作成し、デフォルト値を設定します.
2、fc.SetDPI:画面1インチあたりの解像度を設定
3、fc.SetFont:テキストの描画に使用するフォントの設定
4、fc.SetFontSize:フォントサイズをポンド単位で設定
5、fc.SetClip:描画のためにクリップ長方形を設定する
6、fc.SetDst:ターゲット画像の設定
7、fc.SetSrc:描画操作のソース画像を設定し、通常はimageである.Uniform
8、fc.DrawString:Ptの座標値に基づいて所定のテキスト内容を描画する
ビジネスロジック
サービス/articleを開くservice/article_poster.goメソッドは、Generateメソッドで描画文字のコードロジックを追加し、以下のようにします.
検証#ケンショウ#
文章ポスターを生成するインタフェース
まとめ
この章では連載15に基づいて描画文字を増やしたが、実現は難しくないが、この2つのニーズは一般的に同時に現れ、多くの練習を加えて、中の論理と他のAPIを理解することができる.
リファレンス
このシリーズのサンプルコード go-gin-example
このシリーズのディレクトリ連載一Golang紹介と環境インストール 連載二組Blog API/s(一) 連載三組Blog API/s(二) 連載四組Blog API/s(三) 連載5 JWTによる認証 連載6簡単なファイルログ を作成連載七Golang優雅再起動HTTPサービス 連載8にSwagger を加えた連載9 GolangアプリケーションをDocker に配備連載十カスタムGORM Callbacks 連載十一Cronタイミングタスク 連載十二最適化配置構造及び画像アップロード を実現連載13あなたのアプリケーション構造を最適化し、Redisキャッシュ を実現連載14 Excel のエクスポート、導入を実現連載十五生成QRコード、統合ポスター 連載十六画像に文字を描く 連載十七用Nginx配備Goアプリケーション 番外Golangクロスコンパイル 番外入門Makefile
前言
この章は連載15の補足内容で、一緒に食べることをお勧めします.主に統合されたポスターに文字を描く機能(このニーズもよくある)を実現し、内容は比較的簡単です.
インプリメンテーション
ここではマイクロソフトの黒のフォントを使用していますので、ダウンロードしてruntime/fontsディレクトリに保存してください(フォントファイルは16 MBサイズです)
インストール
$ go get -u github.com/golang/freetype
テキストの描画
サービス/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:画面1インチあたりの解像度を設定
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の座標値に基づいて所定のテキスト内容を描画する
ビジネスロジック
サービス/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
にアクセスし、その生成結果を以下の図に示すように確認する.まとめ
この章では連載15に基づいて描画文字を増やしたが、実現は難しくないが、この2つのニーズは一般的に同時に現れ、多くの練習を加えて、中の論理と他のAPIを理解することができる.
リファレンス
このシリーズのサンプルコード
このシリーズのディレクトリ