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合成图片并添加文字