aboutsummaryrefslogtreecommitdiff
path: root/themagicpipe/imageconverter.go
diff options
context:
space:
mode:
authorBrice Tonon <7442677+vulonkaaz@users.noreply.github.com>2024-07-04 18:51:23 +0200
committerGitHub <noreply@github.com>2024-07-04 18:51:23 +0200
commit385793d0f1ccb434323c2e99591d48f327171f1c (patch)
tree0db74358679ef833fba1bcfdf6a80d92f3d670c4 /themagicpipe/imageconverter.go
parent0acbebdd2cb7dea1dbebd8cd4a3b90facaa3cf95 (diff)
parente4eb4be4e258512fa2ae1d34e126bcff194a6db6 (diff)
Merge pull request #1 from shrapnelnet/master
Inline ImageMagick logic
Diffstat (limited to 'themagicpipe/imageconverter.go')
-rw-r--r--themagicpipe/imageconverter.go61
1 files changed, 53 insertions, 8 deletions
diff --git a/themagicpipe/imageconverter.go b/themagicpipe/imageconverter.go
index 5e5738e..07ce826 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,56 @@ 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
+ }
+ err = magick.SetCompression(imagick.COMPRESSION_LZMA)
+ if err != nil {
+ return "", err
+ }
+ err = magick.StripImage()
+ if err != nil {
+ return "", err
+ }
+ err = magick.SetDepth(8)
if err != nil {
return "", err
}
- return "data:image/png;base64,"+string(output), nil
+ err = magick.QuantizeImage(4, imagick.COLORSPACE_UNDEFINED, 0, imagick.DITHER_METHOD_RIEMERSMA, false)
+ if err != nil {
+ return "", err
+ }
+ imageBytesProcessed, err := magick.GetImageBlob()
+ if err != nil {
+ return "", err
+ }
+ imageBase64Processed := base64.StdEncoding.EncodeToString(imageBytesProcessed)
+ return "data:image/png;base64," + imageBase64Processed, nil
}
-