diff options
author | Brice Tonon <7442677+vulonkaaz@users.noreply.github.com> | 2024-07-04 18:51:23 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-04 18:51:23 +0200 |
commit | 385793d0f1ccb434323c2e99591d48f327171f1c (patch) | |
tree | 0db74358679ef833fba1bcfdf6a80d92f3d670c4 /themagicpipe/imageconverter.go | |
parent | 0acbebdd2cb7dea1dbebd8cd4a3b90facaa3cf95 (diff) | |
parent | e4eb4be4e258512fa2ae1d34e126bcff194a6db6 (diff) |
Merge pull request #1 from shrapnelnet/master
Inline ImageMagick logic
Diffstat (limited to 'themagicpipe/imageconverter.go')
-rw-r--r-- | themagicpipe/imageconverter.go | 61 |
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 } - |