2025-03-07 17:23:50 +08:00

44 lines
1.2 KiB
Go

package utils
import (
"bytes"
"fmt"
"github.com/disintegration/imaging"
"image"
)
// AddWatermarkToImage 添加图片水印
func AddWatermarkToImage(fileBytes []byte, watermarkPath string) ([]byte, error) {
// 将字节切片转为io.Reader
reader := bytes.NewReader(fileBytes)
// 从字节流中解码图片
srcImage, err := imaging.Decode(reader)
if err != nil {
return nil, fmt.Errorf("图片解码失败: %w", err)
}
// 打开水印图片
watermarkImage, err := imaging.Open(watermarkPath)
if err != nil {
return nil, fmt.Errorf("水印图片加载失败: %w", err)
}
// 获取原图片的宽高,用于水印的位置计算
srcBounds := srcImage.Bounds()
watermarkBounds := watermarkImage.Bounds()
// 将水印添加到原图片的右下角
offset := image.Pt(srcBounds.Max.X-watermarkBounds.Max.X, srcBounds.Max.Y-watermarkBounds.Max.Y)
dstImage := imaging.Overlay(srcImage, watermarkImage, offset, 1.0)
// 将处理后的图片保存到字节切片中
var outputBuffer bytes.Buffer
err = imaging.Encode(&outputBuffer, dstImage, imaging.PNG)
if err != nil {
return nil, fmt.Errorf("图片编码失败: %w", err)
}
return outputBuffer.Bytes(), nil
}