44 lines
1.2 KiB
Go
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
|
|
}
|