diff options
author | Tyler <shrapnelnet@protonmail.com> | 2024-07-03 23:55:30 +0100 |
---|---|---|
committer | Tyler <shrapnelnet@protonmail.com> | 2024-07-03 23:55:30 +0100 |
commit | abb174ae9bf4d6d77ff6fd78d1e72fe891495bf8 (patch) | |
tree | ba1aa162383dcef6a1a8d903aec0502c10b907d8 /themagicpipe/imageconverter.go | |
parent | c44f3dd9743819bb018f961b08169b3d457ff2c7 (diff) |
Inline ImageMagick logic (C bindings)
Diffstat (limited to 'themagicpipe/imageconverter.go')
-rw-r--r-- | themagicpipe/imageconverter.go | 45 |
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 } - |