aboutsummaryrefslogtreecommitdiff
path: root/themagicpipe/imageconverter.go
diff options
context:
space:
mode:
authorTyler <shrapnelnet@protonmail.com>2024-07-03 23:55:30 +0100
committerTyler <shrapnelnet@protonmail.com>2024-07-03 23:55:30 +0100
commitabb174ae9bf4d6d77ff6fd78d1e72fe891495bf8 (patch)
treeba1aa162383dcef6a1a8d903aec0502c10b907d8 /themagicpipe/imageconverter.go
parentc44f3dd9743819bb018f961b08169b3d457ff2c7 (diff)
Inline ImageMagick logic (C bindings)
Diffstat (limited to 'themagicpipe/imageconverter.go')
-rw-r--r--themagicpipe/imageconverter.go45
1 files changed, 37 insertions, 8 deletions
diff --git a/themagicpipe/imageconverter.go b/themagicpipe/imageconverter.go
index 5e5738e..9dc8d6e 100644
--- a/themagicpipe/imageconverter.go
+++ b/themagicpipe/imageconverter.go
@@ -1,8 +1,10 @@
package themagicpipe
+
import (
- "os/exec"
- "strings"
+ "encoding/base64"
"errors"
+ "gopkg.in/gographics/imagick.v3/imagick"
+ "strings"
)
// Where the magic happens, the base64 data url image is sent through Imagemagick
@@ -11,13 +13,40 @@ func DataURLConverter(dataURL string) (string, error) {
if !strings.HasPrefix(dataURL, "data:image/png;base64,") {
return "", errors.New("invalid dataURL")
}
- cmd := "base64 -d | convert - -background white -flatten -resize 400x200! -colors 4 PNG8:- | base64 -w0"
- converter := exec.Command("sh","-c",cmd)
- converter.Stdin = strings.NewReader(strings.TrimPrefix(dataURL, "data:image/png;base64,"))
- output, err := converter.Output()
+ imageBase64 := strings.TrimPrefix(dataURL, "data:image/png;base64,")
+ imageRaw, err := base64.StdEncoding.DecodeString(imageBase64)
+ if err != nil {
+ return "", err
+ }
+ // doing conversion inline soothes the soul
+ imagick.Initialize()
+ defer imagick.Terminate()
+ magick := imagick.NewMagickWand()
+ defer magick.Destroy()
+ // read in from base64
+ err = magick.ReadImageBlob(imageRaw)
+ if err != nil {
+ return "", err
+ }
+ // swap all transparent pixels with white
+ transparent := imagick.NewPixelWand()
+ defer transparent.Destroy()
+ transparent.SetColor("none")
+ whiteFill := imagick.NewPixelWand()
+ defer whiteFill.Destroy()
+ whiteFill.SetColor("#ffffff")
+ err = magick.OpaquePaintImage(transparent, whiteFill, 5, false)
+ if err != nil {
+ return "", err
+ }
+ err = magick.ResizeImage(400, 200, imagick.FILTER_POINT)
if err != nil {
return "", err
}
- return "data:image/png;base64,"+string(output), nil
+ imageBytesProcessed, err := magick.GetImageBlob()
+ if err != nil {
+ return "", err
+ }
+ imageBase64Processed := base64.StdEncoding.EncodeToString(imageBytesProcessed)
+ return "data:image/png;base64," + imageBase64Processed, nil
}
-