Better watermarking

This commit is contained in:
DarthSim
2019-08-28 17:08:53 +06:00
parent 5efed836dd
commit 8cef2ee3b2
5 changed files with 109 additions and 153 deletions

109
vips.go
View File

@@ -25,7 +25,7 @@ var (
vipsTypeSupportLoad = make(map[imageType]bool)
vipsTypeSupportSave = make(map[imageType]bool)
watermark *vipsImage
watermark *watermarkData
)
var vipsConf struct {
@@ -126,7 +126,7 @@ func initVips() {
vipsConf.WatermarkOpacity = C.double(conf.WatermarkOpacity)
if err := vipsPrepareWatermark(); err != nil {
if err := vipsLoadWatermark(); err != nil {
logFatal(err.Error())
}
@@ -134,10 +134,6 @@ func initVips() {
}
func shutdownVips() {
if watermark != nil {
watermark.Clear()
}
C.vips_shutdown()
}
@@ -161,61 +157,8 @@ func vipsError() error {
return newUnexpectedError(C.GoString(C.vips_error_buffer()), 1)
}
func vipsPrepareWatermark() error {
data, imgtype, cancel, err := watermarkData()
defer cancel()
if err != nil {
return err
}
if data == nil {
return nil
}
watermark = new(vipsImage)
if err = watermark.Load(data, imgtype, 1, 1.0, 1); err != nil {
return err
}
var tmp *C.VipsImage
if C.vips_apply_opacity(watermark.VipsImage, &tmp, C.double(conf.WatermarkOpacity)) != 0 {
return vipsError()
}
C.swap_and_clear(&watermark.VipsImage, tmp)
if err = watermark.CopyMemory(); err != nil {
return err
}
return nil
}
func vipsResizeWatermark(width, height int) (wm *vipsImage, err error) {
wmW := float64(watermark.VipsImage.Xsize)
wmH := float64(watermark.VipsImage.Ysize)
wr := float64(width) / wmW
hr := float64(height) / wmH
scale := math.Min(wr, hr)
if wmW*scale < 1 {
scale = 1 / wmW
}
if wmH*scale < 1 {
scale = 1 / wmH
}
wm = new(vipsImage)
if C.vips_resize_with_premultiply(watermark.VipsImage, &wm.VipsImage, C.double(scale)) != 0 {
err = vipsError()
}
func vipsLoadWatermark() (err error) {
watermark, err = getWatermarkData()
return
}
@@ -632,48 +575,10 @@ func (img *vipsImage) Embed(gravity gravityType, width, height int, offX, offY i
return nil
}
func (img *vipsImage) ApplyWatermark(opts *watermarkOptions) error {
if watermark == nil {
return nil
}
func (img *vipsImage) ApplyWatermark(wm *vipsImage, opacity float64) error {
var tmp *C.VipsImage
var (
wm *vipsImage
tmp *C.VipsImage
)
defer func() { wm.Clear() }()
var err error
imgW := img.Width()
imgH := img.Height()
if opts.Scale == 0 {
wm = new(vipsImage)
if C.vips_copy_go(watermark.VipsImage, &wm.VipsImage) != 0 {
return vipsError()
}
} else {
wmW := maxInt(int(float64(imgW)*opts.Scale), 1)
wmH := maxInt(int(float64(imgH)*opts.Scale), 1)
if wm, err = vipsResizeWatermark(wmW, wmH); err != nil {
return err
}
}
if opts.Replicate {
if err = wm.Replicate(imgW, imgH); err != nil {
return err
}
} else {
if err = wm.Embed(opts.Gravity, imgW, imgH, opts.OffsetX, opts.OffsetY, rgbColor{0, 0, 0}); err != nil {
return err
}
}
if C.vips_apply_watermark(img.VipsImage, wm.VipsImage, &tmp, C.double(opts.Opacity)) != 0 {
if C.vips_apply_watermark(img.VipsImage, wm.VipsImage, &tmp, C.double(opacity)) != 0 {
return vipsError()
}
C.swap_and_clear(&img.VipsImage, tmp)