亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

golang實現(xiàn)給圖片加水印

 更新時間:2023年12月31日 09:15:02   作者:lmy_loveF  
這篇文章主要為大家詳細介紹了Vue3如何利用golang實現(xiàn)給圖片加水印,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下

預覽效果

需求:

1,員工簽到圖片加水印

2,水印文字需要有半透明的底色,避免水印看不清

3,圖片寬設(shè)置在600,小于600或者大于600都需要等比例修改圖片的高度,保持水印在圖片中的大小和位置

4,處理后圖片和原圖大小不要相差太多

調(diào)用:

	
    fileName := "display_20231229134926805_9512.jpg"
	waterMark := WaterMarkInfo{
		UserInfo: "1123456789-仲夏夜的夢  2023-12-28 17:23:54",
		SignAddress: "[119.092868,34.887314] 中國廣東省深圳市龍崗區(qū)坂田街道華為基地廣東省深圳市南山區(qū)廣東省深圳市南山區(qū)廣東省深圳市南山區(qū)廣東省深圳市南山區(qū)廣東省深圳市南山區(qū)",
	}
	addSigninWaterMark(fileName, waterMark)

圖片加水印方法:

// WaterMarkInfo 水印信息
type WaterMarkInfo struct {
	UserInfo string //用戶信息
	SignAddress string //簽到地址
}
 
// 增加打卡水印
func addSigninWaterMark(fileName string, waterMarkInfo WaterMarkInfo) error {
	//接口異常捕獲
	defer func() {
		if err := recover(); err != nil {
			sbjlog.ExcLog("100", "addSigninWaterMark-圖片增加水印異常:err=%v", err)
		}
	}()
	//需要加水印的圖片
	imgfile, err := os.Open(tempImgDir + fileName)
	if err != nil {
		sbjlog.Debug("addSigninWaterMark os.Open ERROR:%v \r\n", err)
		return err
	}
	defer imgfile.Close()
	jpgimg, err := jpeg.Decode(imgfile)
	if err != nil {
		sbjlog.Debug("addSigninWaterMark jpeg.Decode ERROR:%v \r\n", err)
		return err
	}
	//對圖片進行大小變更,圖片的寬必須是600,水印文字長度是按照600來設(shè)置的
	imgWidth := uint(600)
	imgHeight := uint(800)
	if uint(jpgimg.Bounds().Dx()) != imgWidth {
		imgHeight = uint(imgWidth) * uint(jpgimg.Bounds().Dy()) / uint(jpgimg.Bounds().Dx())
		jpgimg = resize.Resize(600, imgHeight, jpgimg, resize.Bilinear)
	}
	//新建空白圖層
	img := image.NewRGBA64(jpgimg.Bounds())
	pic2FramePadding := 20
	waterMarkHeight := 80
	waterMarkWidth := 600
 
	//新建空白白色圖層
	transparentImg := image.NewRGBA64(image.Rect(0, 0, waterMarkWidth-pic2FramePadding/2, waterMarkHeight))
	//設(shè)置空白白色圖層的大小
	draw.Draw(transparentImg,
		image.Rect(pic2FramePadding/2, pic2FramePadding/2, transparentImg.Bounds().Dx(), transparentImg.Bounds().Dy()),
		image.White,
		image.Point{},
		draw.Over)
	//把原來的圖片畫到空白圖層上
	draw.Draw(img, jpgimg.Bounds(), jpgimg, jpgimg.Bounds().Min, draw.Over)
 
	//設(shè)置白色圖層透明度,color.Alpha值在0-255之間,越靠近0越來透明
	mask := image.NewUniform(color.Alpha{180})
	//把空白圖層畫到空白圖層上
	draw.DrawMask(img, img.Bounds().Add(image.Pt(0, jpgimg.Bounds().Dy()-waterMarkHeight-pic2FramePadding/2)), transparentImg, image.ZP, mask, image.Point{}, draw.Over)
	//給空白圖層加水印
	err = addWaterMarkToImage(img, waterMarkInfo)
	if err != nil {
		return err
	}
 
	//保存到新文件中
	newfile, err := os.Create(tempImgDir + fileName)
	//在盡量不損失圖片質(zhì)量的情況下,保證繪制后圖片和原圖片一樣大:jpeg.Options{94}
	err = jpeg.Encode(newfile, img, &jpeg.Options{94})
	if err != nil {
		fmt.Println(err)
	}
 
	return nil
}

圖片加文字:

func addWaterMarkToImage(newTemplateImage *image.RGBA64, waterMarkInfo WaterMarkInfo) error {
	// 在寫入之前有一些準備工作
	content := freetype.NewContext()
	fontTtf, err := loadFont("runtime/fonts/simsun.ttc")
	if err != nil {
		sbjlog.Debug("addWaterMarkToImage loadFont ERROR:%v \r\n", err)
		return err
	}
 
	content.SetClip(newTemplateImage.Bounds())
	content.SetDst(newTemplateImage)
	content.SetSrc(image.Black) // 設(shè)置字體顏色
	content.SetDPI(72)          // 設(shè)置字體分辨率
 
	content.SetFontSize(14)  // 設(shè)置字體大小
	content.SetFont(fontTtf) // 設(shè)置字體樣式,就是我們上面加載的字體
 
	// 	正式寫入文字
	// 參數(shù)1:要寫入的文字
	// 參數(shù)2:文字坐標
	//dx := newTemplateImage.Bounds().Dx()
	dy := newTemplateImage.Bounds().Dy()
	topSignAddress := waterMarkInfo.SignAddress
	endSignAddress := ""
	if len(waterMarkInfo.SignAddress) > 100 {
		topSignAddress = xstring.SubString(waterMarkInfo.SignAddress, 100)
		endSignAddress = waterMarkInfo.SignAddress[len(topSignAddress):]
	}
	pic2FramePadding := 20
	markHeiht := dy - pic2FramePadding*3
	content.DrawString(waterMarkInfo.UserInfo, freetype.Pt(pic2FramePadding, markHeiht))
	markHeiht = markHeiht + 20
	content.DrawString(topSignAddress, freetype.Pt(pic2FramePadding, markHeiht))
	markHeiht = markHeiht + 20
	content.DrawString(endSignAddress, freetype.Pt(pic2FramePadding, markHeiht))
	return nil
}

加載字體:

// 根據(jù)路徑加載字體文件
// path 字體的路徑
func loadFont(path string) (font *truetype.Font, err error) {
	var fontBytes []byte
	fontBytes, err = ioutil.ReadFile(path) // 讀取字體文件
	if err != nil {
		err = fmt.Errorf("加載字體文件出錯:%s", err.Error())
		return
	}
	font, err = freetype.ParseFont(fontBytes) // 解析字體文件
	if err != nil {
		err = fmt.Errorf("解析字體文件出錯,%s", err.Error())
		return
	}
	return
}

到此這篇關(guān)于golang實現(xiàn)給圖片加水印的文章就介紹到這了,更多相關(guān)golang圖片加水印內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vscode上搭建go開發(fā)環(huán)境詳細完整過程

    vscode上搭建go開發(fā)環(huán)境詳細完整過程

    這篇文章主要給大家介紹了關(guān)于vscode上搭建go開發(fā)環(huán)境的詳細完整過程,Go語言或?qū)⒊蔀樾碌闹髁﹂_發(fā)語言,Go是google開發(fā)的一種靜態(tài)強類型、編譯型、并發(fā)型,并具有垃圾回收功能的編程語言,所以我們有必要學習并掌握它,需要的朋友可以參考下
    2023-10-10
  • golang?RPC包原理和使用詳細介紹

    golang?RPC包原理和使用詳細介紹

    golang的rpc支持三個級別的RPC:TCP、HTTP、JSONRPC。但Go的RPC包是獨一無二的RPC,它和傳統(tǒng)的RPC系統(tǒng)不同,它只支持Go開發(fā)的服務器與客戶端之間的交互,因為在內(nèi)部,它們采用了Gob來編碼
    2022-09-09
  • 簡化Go開發(fā)提高生產(chǎn)力的強大工具及使用詳解

    簡化Go開發(fā)提高生產(chǎn)力的強大工具及使用詳解

    作為?Go?開發(fā)人員,應該都知道維持簡潔高效開發(fā)工作流程的重要性,為了提高工作效率和代碼質(zhì)量,簡化開發(fā)流程并自動執(zhí)行重復性任務至關(guān)重要,在本文中,我們將探討一些強大的工具和技術(shù),它們將簡化?Go?開發(fā)過程,助力您的編碼之旅
    2023-10-10
  • Goland IDEA項目多開設(shè)置方式

    Goland IDEA項目多開設(shè)置方式

    這篇文章主要介紹了Goland IDEA項目多開設(shè)置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 解析Golang中引用類型是否進行引用傳遞

    解析Golang中引用類型是否進行引用傳遞

    這篇文章主要為大家介紹了Golang中引用類型是否進行引用傳遞剖析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Golang實現(xiàn)Md5校驗的代碼示例

    Golang實現(xiàn)Md5校驗的代碼示例

    最近項目中有個需求,就是地圖文件下發(fā)后,接收方需要文件的md5值,和接收到的文件做比對,以免文件不完整,引起bug,于是測試了下本地文件和遠程文件的md5計算,所以本文給大家介紹了Golang實現(xiàn)Md5校驗,需要的朋友可以參考下
    2024-07-07
  • Go標準庫http?server優(yōu)雅啟動深入理解

    Go標準庫http?server優(yōu)雅啟動深入理解

    這篇文章主要介紹了Go標準庫http?server優(yōu)雅啟動深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • 使用Go添加HTTPS的實現(xiàn)代碼示例

    使用Go添加HTTPS的實現(xiàn)代碼示例

    這篇文章主要介紹了使用Go添加HTTPS的實現(xiàn)代碼示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • Go實現(xiàn)map并發(fā)安全的3種方式總結(jié)

    Go實現(xiàn)map并發(fā)安全的3種方式總結(jié)

    Go的原生map不是并發(fā)安全的,在多協(xié)程讀寫同一個map的時候,安全性無法得到保障,這篇文章主要給大家總結(jié)介紹了關(guān)于Go實現(xiàn)map并發(fā)安全的3種方式,需要的朋友可以參考下
    2023-10-10
  • go語言實現(xiàn)二叉樹的序例化與反序列化

    go語言實現(xiàn)二叉樹的序例化與反序列化

    這篇文章主要介紹了go語言實現(xiàn)二叉樹的序例化與反序列化,文章圍繞主題展開詳細內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05

最新評論