最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

預(yù)覽效果

需求:

1,員工簽到圖片加水印

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

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

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

調(diào)用:

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

圖片加水印方法:

// WaterMarkInfo 水印信息
type WaterMarkInfo struct {
	UserInfo string //用戶(hù)信息
	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
	}
	//對(duì)圖片進(jìn)行大小變更,圖片的寬必須是600,水印文字長(zhǎng)度是按照600來(lái)設(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)
	//把原來(lái)的圖片畫(huà)到空白圖層上
	draw.Draw(img, jpgimg.Bounds(), jpgimg, jpgimg.Bounds().Min, draw.Over)
 
	//設(shè)置白色圖層透明度,color.Alpha值在0-255之間,越靠近0越來(lái)透明
	mask := image.NewUniform(color.Alpha{180})
	//把空白圖層畫(huà)到空白圖層上
	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 {
	// 在寫(xiě)入之前有一些準(zhǔn)備工作
	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è)置字體樣式,就是我們上面加載的字體
 
	// 	正式寫(xiě)入文字
	// 參數(shù)1:要寫(xiě)入的文字
	// 參數(shù)2:文字坐標(biāo)
	//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("加載字體文件出錯(cuò):%s", err.Error())
		return
	}
	font, err = freetype.ParseFont(fontBytes) // 解析字體文件
	if err != nil {
		err = fmt.Errorf("解析字體文件出錯(cuò),%s", err.Error())
		return
	}
	return
}

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

相關(guān)文章

  • Golang實(shí)現(xiàn)事務(wù)型內(nèi)存數(shù)據(jù)庫(kù)的方法詳解

    Golang實(shí)現(xiàn)事務(wù)型內(nèi)存數(shù)據(jù)庫(kù)的方法詳解

    內(nèi)存數(shù)據(jù)庫(kù)經(jīng)我們經(jīng)常用到,例如Redis,那么如何從零實(shí)現(xiàn)一個(gè)內(nèi)存數(shù)據(jù)庫(kù)呢,本文旨在介紹如何使用Golang編寫(xiě)一個(gè)KV內(nèi)存數(shù)據(jù)庫(kù)MossDB
    2023-03-03
  • golang 中的 nil的場(chǎng)景分析

    golang 中的 nil的場(chǎng)景分析

    這篇文章主要介紹了golang 中的 nil,本文通過(guò)多種場(chǎng)景分析給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Go語(yǔ)言庫(kù)系列之flag的具體使用

    Go語(yǔ)言庫(kù)系列之flag的具體使用

    這篇文章主要介紹了Go語(yǔ)言庫(kù)系列之flag的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Go語(yǔ)言fmt模塊的完整方法詳解及示例代碼

    Go語(yǔ)言fmt模塊的完整方法詳解及示例代碼

    這篇文章主要介紹了Go語(yǔ)言fmt模塊使用的相關(guān)資料,fmt庫(kù)最基本的功能之一就是格式化輸出,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • goland 設(shè)置project gopath的操作

    goland 設(shè)置project gopath的操作

    這篇文章主要介紹了goland 設(shè)置project gopath的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • go格式“占位符”輸入輸出 類(lèi)似python的input

    go格式“占位符”輸入輸出 類(lèi)似python的input

    這篇文章主要介紹了go格式“占位符”, 輸入輸出,類(lèi)似python的input,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • Golang并發(fā)繞不開(kāi)的重要組件之Channel詳解

    Golang并發(fā)繞不開(kāi)的重要組件之Channel詳解

    Channel是一個(gè)提供可接收和發(fā)送特定類(lèi)型值的用于并發(fā)函數(shù)通信的數(shù)據(jù)類(lèi)型,也是Golang并發(fā)繞不開(kāi)的重要組件之一,本文就來(lái)和大家深入聊聊Channel的相關(guān)知識(shí)吧
    2023-06-06
  • golang中接口對(duì)象的轉(zhuǎn)型兩種方式

    golang中接口對(duì)象的轉(zhuǎn)型兩種方式

    這篇文章主要介紹了golang中接口對(duì)象的轉(zhuǎn)型方式,大家都知道接口對(duì)象的轉(zhuǎn)型有兩種方式,文中通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10
  • Go數(shù)據(jù)結(jié)構(gòu)之HeapMap實(shí)現(xiàn)指定Key刪除堆

    Go數(shù)據(jù)結(jié)構(gòu)之HeapMap實(shí)現(xiàn)指定Key刪除堆

    這篇文章主要給大家介紹了Go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之HeapMap實(shí)現(xiàn)指定Key刪除堆,通過(guò)使用Go語(yǔ)言中的container/heap包,我們可以輕松地實(shí)現(xiàn)一個(gè)優(yōu)先級(jí)隊(duì)列,文中有詳細(xì)的代碼示例講解,需要的朋友可以參考下
    2023-07-07
  • Golang使用pprof檢查內(nèi)存泄漏的全過(guò)程

    Golang使用pprof檢查內(nèi)存泄漏的全過(guò)程

    pprof 是golang提供的一款分析工具,可以分析CPU,內(nèi)存的使用情況,本篇文章關(guān)注它在分析內(nèi)存泄漏方面的應(yīng)用,本文給大家介紹了Golang使用pprof檢查內(nèi)存泄漏的全過(guò)程,文中通過(guò)代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02

最新評(píng)論

荆门市| 卓尼县| 常熟市| 津南区| 缙云县| 汨罗市| 什邡市| 临潭县| 海南省| 峨边| 临安市| 瓦房店市| 荣成市| 海口市| 孝感市| 仪征市| 定边县| 登封市| 西城区| 新龙县| 洮南市| 紫阳县| 土默特左旗| 涪陵区| 娱乐| 三都| 周口市| 夏河县| 吕梁市| 四会市| 中卫市| 金山区| 南宁市| 蛟河市| 治县。| 剑河县| 屯留县| 湖口县| 云霄县| 通山县| 吴忠市|