golang 使用去合成图片,文字
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang 使用去合成图片,文字相关的知识,希望对你有一定的参考价值。
//https://studygolang.com/articles/4403
//https://blog.golang.org/go-imagedraw-package
package main
import (
"os"
"image/png"
"image"
"image/color"
"log"
"io/ioutil"
"github.com/golang/freetype"
"fmt"
"image/draw"
)
func main() {
createCImage()
}
func createImage() {
imgfile, err := os.Open("test_2.png")
if err != nil {
fmt.Printf("err %v", err)
}
defer imgfile.Close()
img, _, err := image.Decode(imgfile)
if err != nil {
fmt.Printf("err %v", err)
}
//fmt.Printf("image:%v, name:%v", img, name)
imgRgba := image.NewNRGBA(img.Bounds())
draw.Draw(imgRgba, imgRgba.Bounds(), img, image.ZP, draw.Src)
////设置每个点的 RGBA (Red,Green,Blue,Alpha(设置透明度))
//for y := 0; y < dy; y++ {
// for x := 0; x < dx; x++ {
// //设置一块 白色(255,255,255)不透明的背景
// img.Set(x, y, color.RGBA{255, 255, 255, 255})
// }
//}
//读取字体数据
fontBytes, err := ioutil.ReadFile("test_font.ttf")
if err != nil {
log.Println(err)
}
//载入字体数据
font, err := freetype.ParseFont(fontBytes)
if err != nil {
log.Println("load front fail", err)
}
f := freetype.NewContext()
//设置分辨率
f.SetDPI(72)
//设置字体
f.SetFont(font)
//设置尺寸
f.SetFontSize(100)
f.SetClip(imgRgba.Bounds())
//设置输出的图片
f.SetDst(imgRgba)
//设置字体颜色(红色)
f.SetSrc(image.NewUniform(color.RGBA{255, 0, 0, 255}))
//设置字体的位置
pt := freetype.Pt(10, 40+int(f.PointToFixed(26))>>8)
_, err = f.DrawString("hello,世界", pt)
if err != nil {
log.Fatal(err)
}
imgW, _ := os.Create("test_output.png")
//以png 格式写入文件
err = png.Encode(imgW, imgRgba)
if err != nil {
log.Fatal(err)
}
}
func createCImage() {
imgfile, err := os.Open("test_2.png")
if err != nil {
fmt.Printf("err %v", err)
}
defer imgfile.Close()
img, _, err := image.Decode(imgfile)
if err != nil {
fmt.Printf("err %v", err)
}
//fmt.Printf("image:%v, name:%v", img, name)
imgRgba := image.NewNRGBA(img.Bounds())
imgFileHead, _ := os.Open("test_1.png")
defer imgFileHead.Close()
imgHead, _, err := image.Decode(imgFileHead)
if err != nil {
fmt.Printf("err %v", err, imgHead)
}
//fmt.Printf("image:%v, name:%v", img, name)
//imgRgbaHead := image.NewNRGBA(imgHead.Bounds())
draw.Draw(imgRgba, imgRgba.Bounds(), img, image.ZP, draw.Src)
draw.DrawMask(imgRgba, imgRgba.Bounds(), imgHead, image.ZP, &CircleMask{image.Pt(95, 95), 95}, image.ZP, draw.Over)
imgW, _ := os.Create("test_output.png")
//以png 格式写入文件
err = png.Encode(imgW, imgRgba)
if err != nil {
log.Fatal(err)
}
}
type CircleMask struct {
P image.Point
R int
}
func (c *CircleMask) ColorModel() color.Model {
return color.AlphaModel
}
func (c *CircleMask) Bounds() image.Rectangle {
return image.Rect(c.P.X-c.R, c.P.Y-c.R, c.P.X+c.R, c.P.Y+c.R)
}
func (c *CircleMask) At(x, y int) color.Color {
xx, yy, rr := float64(x-c.P.X)+0.5, float64(y-c.P.Y)+0.5, float64(c.R)
if xx*xx+yy*yy < rr*rr {
return color.Alpha{255}
}
return color.Alpha{0}
}
php图文合成文字居中(png图片合成)
header(‘Content-type:text/html;charset=utf-8‘);
/**
* png图文合成 by wangzhaobo
* @param string $pic_path 图片目录
* @param array $text 文字
* @param array $font_file 路径
* @param array $font_size 文字大小
* @param array $font_pos_y 文字距离图片高度
* @return string 合成图片的名称
*/
function signImg($pic_path,$text,$font_file,$font_size,$font_pos_y){
//图片信息
list($pic_w, $pic_h, $pic_type) = getimagesize($pic_path);
//创建图片的实例
$pic = imagecreatefrompng($pic_path);
imagesavealpha($pic,true);//这里很重要 意思是不要丢了图像的透明色;
$white = imagecolorallocate($pic, 255, 255, 255);//默认的文字颜色
$yellow = imagecolorallocate($pic, 236, 185, 7);//默认的文字颜色
$font_color = [$white,$yellow,$white,$white];
foreach($text as $key=>$value){
$arr = imagettfbbox($font_size[$key],0,$font_file[$key],$text[$key]);
$text_width = $arr[2]-$arr[0];
imagefttext($pic, $font_size[$key], 0, ($pic_w-$text_width)/2, $font_pos_y[$key], $font_color[$key], $font_file[$key], $text[$key]);
}
//按照画布类型输出图片
$pngName = time().rand(0,9).".png";//生成图片名称
switch ($pic_type) {
case 1://GIF
case 2://JPG
case 3://PNG
// //直接输出图片
header(‘Content-Type: image/png‘);
imagepng($pic);
// 保存图片路径
// imagepng($pic,"./assets/sign/".$pngName);
// return $pngName;
break;
default:
break;
}
imagedestroy($pic);
}
$pic_path = ‘./assets/images/backgroud.png‘;
$text = [
‘若水电影电竞女神巡演赛成都站‘,
‘王若水‘,
‘观赛时间:2017.9.2 12:30‘,
‘观赛地点:万达电影地方电竞女神巡演赛(成都站)‘
];
$font_file = [
"./assets/fonts/MSYH.TTF",//粗体
"./assets/fonts/MSYH.TTF",//粗体
"./assets/fonts/MSYH.TTF",//细体
"./assets/fonts/MSYH.TTF"//细体
];
$font_size = [24,42,18,18];
$font_pos_y = [298,470,600,650];
signImg($pic_path,$text,$font_file,$font_size,$font_pos_y);
// header("Content-type: image/png");
// echo $a;
素材地址:链接:http://pan.baidu.com/s/1c2vUCAO 密码:3s2i
以上是关于golang 使用去合成图片,文字的主要内容,如果未能解决你的问题,请参考以下文章
golang 使用科大讯飞进行语音合成与识别
iOS 图片水印图片合成文字或图片实现
php图文合成文字居中(png图片合成)
python PIL 合成图片,图片加文字
php合成图片 文字
java合成图片并添加文字