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 }