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)境詳細完整過程
這篇文章主要給大家介紹了關(guān)于vscode上搭建go開發(fā)環(huán)境的詳細完整過程,Go語言或?qū)⒊蔀樾碌闹髁﹂_發(fā)語言,Go是google開發(fā)的一種靜態(tài)強類型、編譯型、并發(fā)型,并具有垃圾回收功能的編程語言,所以我們有必要學習并掌握它,需要的朋友可以參考下2023-10-10簡化Go開發(fā)提高生產(chǎn)力的強大工具及使用詳解
作為?Go?開發(fā)人員,應該都知道維持簡潔高效開發(fā)工作流程的重要性,為了提高工作效率和代碼質(zhì)量,簡化開發(fā)流程并自動執(zhí)行重復性任務至關(guān)重要,在本文中,我們將探討一些強大的工具和技術(shù),它們將簡化?Go?開發(fā)過程,助力您的編碼之旅2023-10-10Go實現(xiàn)map并發(fā)安全的3種方式總結(jié)
Go的原生map不是并發(fā)安全的,在多協(xié)程讀寫同一個map的時候,安全性無法得到保障,這篇文章主要給大家總結(jié)介紹了關(guān)于Go實現(xiàn)map并發(fā)安全的3種方式,需要的朋友可以參考下2023-10-10