68 lines
1.2 KiB
Go
68 lines
1.2 KiB
Go
package watermark
|
|
|
|
import (
|
|
"errors"
|
|
"github.com/nfnt/resize"
|
|
"image"
|
|
"image/draw"
|
|
"image/jpeg"
|
|
"image/png"
|
|
"os"
|
|
"sync"
|
|
)
|
|
|
|
func AddWatermark(origImage string, watermarkImage string) (image.Image, error) {
|
|
wg := sync.WaitGroup{}
|
|
|
|
var img image.Image
|
|
var watermark image.Image
|
|
|
|
wg.Add(1)
|
|
go func() {
|
|
defer wg.Done()
|
|
var err error
|
|
file, err := os.Open(origImage)
|
|
if err != nil {
|
|
return
|
|
}
|
|
defer file.Close()
|
|
|
|
img, err = jpeg.Decode(file)
|
|
if err != nil {
|
|
return
|
|
}
|
|
}()
|
|
|
|
wg.Add(1)
|
|
go func() {
|
|
defer wg.Done()
|
|
var err error
|
|
watermarkFile, err := os.Open(watermarkImage)
|
|
if err != nil {
|
|
return
|
|
}
|
|
defer watermarkFile.Close()
|
|
|
|
watermark, err = png.Decode(watermarkFile)
|
|
if err != nil {
|
|
return
|
|
}
|
|
}()
|
|
wg.Wait()
|
|
|
|
if img == nil || watermark == nil {
|
|
return nil, errors.New("failed to decode image")
|
|
}
|
|
|
|
offset := image.Pt(10, 10)
|
|
b := img.Bounds()
|
|
m := image.NewRGBA(b)
|
|
draw.Draw(m, b, img, image.Point{}, draw.Src)
|
|
draw.Draw(m, watermark.Bounds().Add(offset), watermark, image.Point{}, draw.Over)
|
|
return m, nil
|
|
}
|
|
|
|
func Resize(img image.Image, width int) image.Image {
|
|
return resize.Resize(uint(width), 0, img, resize.Lanczos3)
|
|
}
|