Skip to content
Snippets Groups Projects
Verified Commit 651b0210 authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Improve colorspace handling significantly

parent 3002a95b
Branches
No related tags found
No related merge requests found
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/go-redis/redis v6.15.6+incompatible h1:H9evprGPLI8+ci7fxQx6WNZHJSb7be8FqJQRhdQZ5Sg=
github.com/go-redis/redis v6.15.6+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg=
github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.10.3 h1:OoxbjfXVZyod1fmWYhI7SEyaD8B00ynP3T+D5GiyHOY=
github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M=
github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
github.com/onsi/gomega v1.7.1 h1:K0jcRCwNQM3vFGh1ppMtDh/+7ApJrjldlX8fA0jDTLQ=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
github.com/onsi/gomega v1.10.4 h1:NiTx7EEvBzu9sFOD1zORteLSt3o8gnlvZZwSE9TnY9U=
github.com/onsi/gomega v1.10.4/go.mod h1:g/HbgYopi++010VEqkFgJHKC09uJiW9UkXvMUuKHUCQ=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb h1:eBmm0M9fYhWpKZLjQUUKka/LtIxf46G4fxeEz5KJr9U=
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
......@@ -50,10 +41,9 @@ golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 h1:DYfZAGf2WMFjMxbgTjaC+2HC7NkNAQs+6Q8b9WEB/F4=
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
......@@ -66,18 +56,15 @@ google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM=
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/gographics/imagick.v2 v2.5.0 h1:3wOeg/IgtagJtveISUaX9A3F/L/5PxaFHkAz5AzgbgA=
gopkg.in/gographics/imagick.v2 v2.5.0/go.mod h1:of4TbGX8yMcpgWkWFjha7FsOFr+NjOJ5O1qtKU27Yj0=
gopkg.in/gographics/imagick.v2 v2.6.0 h1:ewRsUQk3QkjGumERlndbFn/kTYRjyMaPY5gxwpuAhik=
gopkg.in/gographics/imagick.v2 v2.6.0/go.mod h1:/QVPLV/iKdNttRKthmDkeeGg+vdHurVEPc8zkU0XgBk=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
package lib
import "encoding/base64"
var WorkingColorspace, _ = base64.StdEncoding.DecodeString("AAAEMGxjbXMEMAAAbW50clJHQiBYWVogB+AABQABAA0AGQABYWNzcCpuaXgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1sY21zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMZGVzYwAAARQAAABGY3BydAAAAVwAAAE2d3RwdAAAApQAAAAUY2hhZAAAAqgAAAAsclhZWgAAAtQAAAAUYlhZWgAAAugAAAAUZ1hZWgAAAvwAAAAUclRSQwAAAxAAAAAQZ1RSQwAAAxAAAAAQYlRSQwAAAxAAAAAQY2hybQAAAyAAAAAkZG1uZAAAA0QAAADqbWx1YwAAAAAAAAABAAAADGVuVVMAAAAqAAAAHABBAEMARQBTAC0AZQBsAGwAZQAtAFYANAAtAGcAMQAwAC4AaQBjAGMAAAAAbWx1YwAAAAAAAAABAAAADGVuVVMAAAEaAAAAHABDAG8AcAB5AHIAaQBnAGgAdAAgADIAMAAxADYALAAgAEUAbABsAGUAIABTAHQAbwBuAGUAIAAoAGgAdAB0AHAAOgAvAC8AbgBpAG4AZQBkAGUAZwByAGUAZQBzAGIAZQBsAG8AdwAuAGMAbwBtAC8AKQAsACAAQwBDAC0AQgBZAC0AUwBBACAAMwAuADAAIABVAG4AcABvAHIAdABlAGQAIAAoAGgAdAB0AHAAcwA6AC8ALwBjAHIAZQBhAHQAaQB2AGUAYwBvAG0AbQBvAG4AcwAuAG8AcgBnAC8AbABpAGMAZQBuAHMAZQBzAC8AYgB5AC0AcwBhAC8AMwAuADAALwBsAGUAZwBhAGwAYwBvAGQAZQApAC4AAAAAWFlaIAAAAAAAAPbWAAEAAAAA0y1zZjMyAAAAAAABCL8AAARO///2aAAABYkAAP4D///8vv///jkAAALmAADQIlhZWiAAAAAAAAD9qwAAXKX///9OWFlaIAAAAAD///YJ///qZAAA0cJYWVogAAAAAAAAAyIAALj3AAACHXBhcmEAAAAAAAAAAAABAABjaHJtAAAAAAADAAAAALwWAABD6wAAAAAAAQAAAAAAB///7EltbHVjAAAAAAAAAAEAAAAMZW5VUwAAAM4AAAAcAEEAQwBFAFMAIABjAGgAcgBvAG0AYQB0AGkAYwBpAHQAaQBlAHMAIABmAHIAbwBtACAAVABCAC0AMgAwADEANAAtADAAMAA0ACwAIABoAHQAdABwADoALwAvAHcAdwB3AC4AbwBzAGMAYQByAHMALgBvAHIAZwAvAHMAYwBpAGUAbgBjAGUALQB0AGUAYwBoAG4AbwBsAG8AZwB5AC8AYQBjAGUAcwAvAGEAYwBlAHMALQBkAG8AYwB1AG0AZQBuAHQAYQB0AGkAbwBuAAAAAA==")
package lib
import (
"gopkg.in/gographics/imagick.v2/imagick"
"strings"
)
func ProcessImageInstance(
wand *imagick.MagickWand,
size Size,
quality Quality,
parameters ImageParameters,
target string,
) error {
var err error
var mw *imagick.MagickWand
mw = wand.Clone()
defer mw.Destroy()
if err = ResizeImageInstance(mw, size); err != nil {
return err
}
for _, key := range mw.GetImageProperties("*") {
if !strings.HasPrefix(key, "png:") {
if err = mw.DeleteImageProperty(key); err != nil {
return err
}
}
}
if iccProfile, iccProfileOk := parameters.profiles["icc"]; iccProfileOk {
err = mw.ProfileImage("icc", iccProfile)
} else if iptcProfile, iptcProfileOk := parameters.profiles["iptc"]; iptcProfileOk {
err = mw.ProfileImage("iptc", iptcProfile)
} else {
err = mw.TransformImageColorspace(parameters.colorspace)
}
if err = mw.SetImageDepth(parameters.depth); err != nil {
return err
}
if quality.CompressionQuality != 0 {
_ = mw.SetImageCompressionQuality(quality.CompressionQuality)
}
if len(quality.SamplingFactors) != 0 {
_ = mw.SetSamplingFactors(quality.SamplingFactors)
}
err = mw.WriteImage(target)
return err
}
package lib
import (
"fmt"
"gopkg.in/gographics/imagick.v2/imagick"
"path/filepath"
)
func goroutineWrapper(
errorChannel chan error,
wand *imagick.MagickWand,
config *Config, path string,
definition SizeDefinition,
parameters ImageParameters,
) {
errorChannel <- ProcessImageInstance(
wand,
definition.Size,
config.Quality,
parameters,
path,
)
}
func ResizeImage(config *Config, imageId string) []error {
var err error
errorChannel := make(chan error)
wand := imagick.NewMagickWand()
defer wand.Destroy()
if err = wand.SetOption("png:include-chunk", "bKGD,cHRM,iCCP"); err != nil {
return []error{err}
}
if err = wand.SetOption("png:exclude-chunk", "EXIF,iTXt,tEXt,zTXt,date"); err != nil {
return []error{err}
}
if err = wand.ReadImage(filepath.Join(config.SourceFolder, imageId)); err != nil {
return []error{err}
}
_ = wand.AutoOrientImage()
colorSpace := wand.GetImageColorspace()
if colorSpace == imagick.COLORSPACE_UNDEFINED {
colorSpace = imagick.COLORSPACE_SRGB
}
profiles := map[string][]byte{}
for _, name := range wand.GetImageProfiles("*") {
profiles[name] = []byte(wand.GetImageProfile(name))
}
parameters := ImageParameters{
depth: wand.GetImageDepth(),
profiles: profiles,
colorspace: colorSpace,
}
if err = wand.SetImageDepth(16); err != nil {
panic(err)
}
if err = wand.ProfileImage("icc", WorkingColorspace); err != nil {
panic(err)
}
for _, definition := range config.Sizes {
path := filepath.Join(config.TargetFolder, fmt.Sprintf("%s%s", imageId, definition.Suffix))
go goroutineWrapper(errorChannel, wand, config, path, definition, parameters)
}
errors := make([]error, 0)
for i := 0; i < len(config.Sizes); i++ {
err := <-errorChannel
if err != nil {
errors = append(errors, err)
}
}
return errors
}
package main
package lib
import (
"errors"
......@@ -7,17 +7,9 @@ import (
"math"
)
func resize(wand *imagick.MagickWand, wandLinear *imagick.MagickWand, originalColorSpace imagick.ColorspaceType, profiles map[string]string, size Size, quality Quality, target string) error {
func ResizeImageInstance(mw *imagick.MagickWand, size Size) error {
var err error
var mw *imagick.MagickWand
if size.Width == 0 && size.Height == 0 {
mw = wand.Clone()
defer mw.Destroy()
} else {
mw = wandLinear.Clone()
defer mw.Destroy()
if size.Width != 0 || size.Height != 0 {
width := mw.GetImageWidth()
height := mw.GetImageHeight()
......@@ -47,8 +39,7 @@ func resize(wand *imagick.MagickWand, wandLinear *imagick.MagickWand, originalCo
dx := int((width - cWidth) / 2)
dy := int((height - cHeight) / 2)
err = mw.CropImage(cWidth, cHeight, dx, dy)
if err != nil {
if err = mw.CropImage(cWidth, cHeight, dx, dy); err != nil {
return err
}
......@@ -69,33 +60,11 @@ func resize(wand *imagick.MagickWand, wandLinear *imagick.MagickWand, originalCo
}
if (width != nWidth) || (height != nHeight) {
err = mw.ResizeImage(nWidth, nHeight, imagick.FILTER_BOX, 1)
if err != nil {
if err = mw.ResizeImage(nWidth, nHeight, imagick.FILTER_BOX, 1); err != nil {
return err
}
}
}
err = mw.TransformImageColorspace(originalColorSpace)
if err != nil {
return err
}
if quality.CompressionQuality != 0 {
_ = mw.SetImageCompressionQuality(quality.CompressionQuality)
}
if len(quality.SamplingFactors) != 0 {
_ = mw.SetSamplingFactors(quality.SamplingFactors)
}
_ = mw.StripImage()
for key, value := range profiles {
_ = mw.SetImageProfile(key, []byte(value))
}
err = mw.WriteImage(target)
return err
return nil
}
package main
package lib
import (
"encoding/json"
"gopkg.in/gographics/imagick.v2/imagick"
"os"
"time"
)
......@@ -15,6 +16,12 @@ type Image struct {
MimeType string `json:"mime_type"`
}
type ImageParameters struct {
profiles map[string][]byte
colorspace imagick.ColorspaceType
depth uint
}
type Result struct {
Id string `json:"id"`
Success bool `json:"success"`
......@@ -66,8 +73,8 @@ type Config struct {
func NewConfigFromEnv() Config {
config := Config{}
json.Unmarshal([]byte(os.Getenv("IK8R_SIZES")), &config.Sizes)
json.Unmarshal([]byte(os.Getenv("IK8R_QUALITY")), &config.Quality)
_ = json.Unmarshal([]byte(os.Getenv("IK8R_SIZES")), &config.Sizes)
_ = json.Unmarshal([]byte(os.Getenv("IK8R_QUALITY")), &config.Quality)
config.SourceFolder = os.Getenv("IK8R_SOURCE_FOLDER")
config.TargetFolder = os.Getenv("IK8R_TARGET_FOLDER")
config.Redis.Address = os.Getenv("IK8R_REDIS_ADDRESS")
......
......@@ -3,6 +3,7 @@ package main
import (
"encoding/json"
"fmt"
"git.kuschku.de/justjanne/imghost/lib"
"github.com/go-redis/redis"
"gopkg.in/gographics/imagick.v2/imagick"
"net/http"
......@@ -11,7 +12,7 @@ import (
"time"
)
func returnResult(config *Config, client *redis.Client, result Result) {
func returnResult(config *lib.Config, client *redis.Client, result lib.Result) {
raw, err := json.Marshal(result)
if err != nil {
panic(err)
......@@ -19,79 +20,31 @@ func returnResult(config *Config, client *redis.Client, result Result) {
client.Publish(config.ResultChannel, string(raw))
}
func generateSize(errorChannel chan error, wand *imagick.MagickWand, wandLinear *imagick.MagickWand, colorSpace imagick.ColorspaceType, profiles map[string]string, config *Config, image Image, definition SizeDefinition) {
errorChannel <- resize(
wand,
wandLinear,
colorSpace,
profiles,
definition.Size,
config.Quality,
filepath.Join(config.TargetFolder, fmt.Sprintf("%s%s", image.Id, definition.Suffix)),
)
}
func processImage(config *Config, client *redis.Client, value string) {
image := Image{}
func processImage(config *lib.Config, client *redis.Client, value string) {
image := lib.Image{}
if err := json.Unmarshal([]byte(value), &image); err != nil {
panic(err)
}
fmt.Printf("Received task %s at %d\n", image.Id, time.Now().Unix())
errorChannel := make(chan error)
wand := imagick.NewMagickWand()
defer wand.Destroy()
err := wand.ReadImage(filepath.Join(config.SourceFolder, image.Id))
if err != nil {
panic(err)
}
_ = wand.AutoOrientImage()
wandLinear := wand.Clone()
defer wandLinear.Destroy()
colorSpace := wand.GetImageColorspace()
if colorSpace == imagick.COLORSPACE_UNDEFINED {
colorSpace = imagick.COLORSPACE_SRGB
}
profiles := map[string]string{}
for _, name := range wand.GetImageProfiles("*") {
profiles[name] = wand.GetImageProfile(name)
}
err = wandLinear.TransformImageColorspace(imagick.COLORSPACE_LAB)
if err != nil {
panic(err)
}
for _, definition := range config.Sizes {
go generateSize(errorChannel, wand, wandLinear, colorSpace, profiles, config, image, definition)
}
errors := lib.ResizeImage(config, image.Id)
_ = os.Remove(filepath.Join(config.SourceFolder, image.Id))
errors := make([]string, 0)
for i := 0; i < len(config.Sizes); i++ {
err := <-errorChannel
if err != nil {
errors = append(errors, err.Error())
errorMessages := make([]string, len(errors))
for i, err := range errors {
errorMessages[i] = err.Error()
}
}
os.Remove(filepath.Join(config.SourceFolder, image.Id))
fmt.Printf("Finished task %s at %d\n", image.Id, time.Now().Unix())
if len(errors) != 0 {
returnResult(config, client, Result{
returnResult(config, client, lib.Result{
Id: image.Id,
Success: false,
Errors: errors,
Errors: errorMessages,
})
} else {
returnResult(config, client, Result{
returnResult(config, client, lib.Result{
Id: image.Id,
Success: true,
})
......@@ -100,7 +53,7 @@ func processImage(config *Config, client *redis.Client, value string) {
func main() {
go func() {
config := NewConfigFromEnv()
config := lib.NewConfigFromEnv()
imagick.Initialize()
defer imagick.Terminate()
......@@ -120,11 +73,10 @@ func main() {
}()
http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("OK"))
_, _ = w.Write([]byte("OK"))
})
err := http.ListenAndServe(":8080", nil)
if err != nil {
if err := http.ListenAndServe(":8080", nil); err != nil {
panic(err)
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment