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) }