溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

go怎么實現(xiàn)圖片拼接與文字書寫

發(fā)布時間:2022-01-27 09:09:13 來源:億速云 閱讀:252 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細介紹“go怎么實現(xiàn)圖片拼接與文字書寫”,內(nèi)容詳細,步驟清晰,細節(jié)處理妥當,希望這篇“go怎么實現(xiàn)圖片拼接與文字書寫”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。

    一:圖片拼接

    go標準庫的image包本身就能實現(xiàn)拼接,因此還是比較簡單的

    直接上代碼

    1.1 圖片拼接代碼

    //圖片拼接
    func MergeImageNew(base image.Image, mask image.Image, paddingX int, paddingY int) (*image.RGBA, error) {
    	baseSrcBounds := base.Bounds().Max
    
    	maskSrcBounds := mask.Bounds().Max
    
    	newWidth := baseSrcBounds.X
    	newHeight := baseSrcBounds.Y
    
    	maskWidth := maskSrcBounds.X
    	maskHeight := maskSrcBounds.Y
    
    	des := image.NewRGBA(image.Rect(0, 0, newWidth, newHeight)) // 底板
    	//首先將一個圖片信息存入jpg
    	draw.Draw(des, des.Bounds(), base, base.Bounds().Min, draw.Over)
    	//將另外一張圖片信息存入jpg
    	draw.Draw(des, image.Rect(paddingX, newHeight-paddingY-maskHeight, (paddingX+maskWidth), (newHeight-paddingY)), mask, image.ZP, draw.Over)
    
    	return des, nil
    }

    核心就是使用image>newRGBA新建一個空白底圖,讓后將背景圖,拼接圖使用draw.Draw畫上去就好了。

    1.2 從本地、網(wǎng)絡(luò)讀取圖片

    從本地讀取

    func GetImageFromFile(filePath string) (img image.Image, err error) {
    	f1Src, err := os.Open(filePath)
    
    	if err != nil {
    		return nil, err
    	}
    	defer f1Src.Close()
    
    	buff := make([]byte, 512) // why 512 bytes ? see http://golang.org/pkg/net/http/#DetectContentType
    	_, err = f1Src.Read(buff)
    
    	if err != nil {
    		return nil, err
    	}
    
    	filetype := http.DetectContentType(buff)
    
    	fmt.Println(filetype)
    
    	fSrc, err := os.Open(filePath)
    	defer fSrc.Close()
    
    	switch filetype {
    	case "image/jpeg", "image/jpg":
    		img, err = jpeg.Decode(fSrc)
    		if err != nil {
    			fmt.Println("jpeg error")
    			return nil, err
    		}
    
    	case "image/gif":
    		img, err = gif.Decode(fSrc)
    		if err != nil {
    			return nil, err
    		}
    
    	case "image/png":
    		img, err = png.Decode(fSrc)
    		if err != nil {
    			return nil, err
    		}
    	default:
    		return nil, err
    	}
    	return img, nil
    }

    從網(wǎng)絡(luò)中讀取

    func GetImageFromNet(url string) (image.Image, error) {
    	res, err := http.Get(url)
    	if err != nil || res.StatusCode != 200 {
    		return nil, err
    	}
    	defer res.Body.Close()
    	m, _, err := image.Decode(res.Body)
    	return m, err
    }

    保存圖片

    func SaveImage(targetPath string, m image.Image) error {
    	fSave, err := os.Create(targetPath)
    	if err != nil {
    		return err
    	}
    	defer fSave.Close()
    
    	err = jpeg.Encode(fSave, m, nil)
    
    	if err != nil {
    		return err
    	}
    
    	return nil
    }

    二:文字書寫

    圖片書寫文字是基于 github.com/golang/freetype 這個庫實現(xiàn)的

    import (
    	"github.com/golang/freetype"
    	"github.com/golang/freetype/truetype"
    	"golang.org/x/image/font"
    	"image"
    	"io/ioutil"
    )
    
    //字體相關(guān)
    type TextBrush struct {
    	FontType  *truetype.Font
    	FontSize  float64
    	FontColor *image.Uniform
    	TextWidth int
    }
    
    func NewTextBrush(FontFilePath string, FontSize float64, FontColor *image.Uniform, textWidth int) (*TextBrush, error) {
    	fontFile, err := ioutil.ReadFile(FontFilePath)
    	if err != nil {
    		return nil, err
    	}
    	fontType, err := truetype.Parse(fontFile)
    	if err != nil {
    		return nil, err
    	}
    	if textWidth <= 0 {
    		textWidth = 20
    	}
    	return &TextBrush{FontType: fontType, FontSize: FontSize, FontColor: FontColor, TextWidth: textWidth}, nil
    }
    
    // 圖片插入文字
    func (fb *TextBrush) DrawFontOnRGBA(rgba *image.RGBA, pt image.Point, content string) {
    	c := freetype.NewContext()
    	c.SetDPI(72)
    	c.SetFont(fb.FontType)
    	c.SetHinting(font.HintingFull)
    	c.SetFontSize(fb.FontSize)
    	c.SetClip(rgba.Bounds())
    	c.SetDst(rgba)
    	c.SetSrc(fb.FontColor)
    	c.DrawString(content, freetype.Pt(pt.X, pt.Y))
    
    }
    
    func Image2RGBA(img image.Image) *image.RGBA {
    
    	baseSrcBounds := img.Bounds().Max
    	newWidth := baseSrcBounds.X
    	newHeight := baseSrcBounds.Y
    	des := image.NewRGBA(image.Rect(0, 0, newWidth, newHeight)) // 底板
    	//首先將一個圖片信息存入jpg
    	draw.Draw(des, des.Bounds(), img, img.Bounds().Min, draw.Over)
    	return des
    }

    使用example

    func TestTextBrush_DrawFontOnRGBA(t *testing.T) {
    
    	textBrush, err := NewTextBrush("字體庫ttf位置", 20, image.Black, 20)
    	if err != nil {
    		t.Log(err)
    	}
    
    	backgroud, err := GetImageFromFile("./resource/backgroud.jpg")
    	if err != nil {
    		t.Log(err)
    	}
    	des := Image2RGBA(backgroud)
    	textBrush.DrawFontOnRGBA(des, image.Pt(10, 50), "世界你好")
    
    	//調(diào)整顏色
    	textBrush.FontColor = image.NewUniform(color.RGBA{
    		R: 0x8E,
    		G: 0xE5,
    		B: 0xEE,
    		A: 255,
    	})
    
    	textBrush.DrawFontOnRGBA(des, image.Pt(10, 80), "我是用Go拼上的文字")
    
    	if err := SaveImage("./resource/text.png", des); err != nil {
    		t.Log(err)
    	}
    }

    先使用NewTextBrush第一個參數(shù)是字體庫文件位置。這里使用的ttf格式的字體庫,網(wǎng)上應(yīng)該有免費的字體庫。

    讀到這里,這篇“go怎么實現(xiàn)圖片拼接與文字書寫”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    go
    AI