diff options
| author | horus_arch | 2015-04-19 22:09:52 +0200 |
|---|---|---|
| committer | horus_arch | 2015-04-19 22:09:52 +0200 |
| commit | 01e9a34952bd6ddd383680b0ca2312e476ad07a6 (patch) | |
| tree | 00902575e5c271cc5d35ea65aa8795b8caeb97bc /imageprocessor/gm | |
| download | mandible-01e9a34952bd6ddd383680b0ca2312e476ad07a6.tar.gz | |
Initial commit.
Diffstat (limited to 'imageprocessor/gm')
| -rw-r--r-- | imageprocessor/gm/gm.go | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/imageprocessor/gm/gm.go b/imageprocessor/gm/gm.go new file mode 100644 index 0000000..e9e76d9 --- /dev/null +++ b/imageprocessor/gm/gm.go @@ -0,0 +1,202 @@ +package gm + +import ( + "bytes" + "errors" + "fmt" + "log" + "os/exec" + "time" +) + +const GM_COMMAND = "convert" + +func ConvertToJpeg(filename string) (string, error) { + outfile := fmt.Sprintf("%s_jpg", filename) + + args := []string{ + filename, + "-flatten", + "JPEG:" + outfile, + } + + err := runConvertCommand(args) + if err != nil { + return "", err + } + + return outfile, nil +} + +func FixOrientation(filename string) (string, error) { + outfile := fmt.Sprintf("%s_ort", filename) + + args := []string{ + filename, + "-auto-orient", + outfile, + } + + err := runConvertCommand(args) + if err != nil { + return "", err + } + + return outfile, nil +} + +func Quality(filename string, quality int) (string, error) { + outfile := fmt.Sprintf("%s_q", filename) + + args := []string{ + filename, + "-quality", + fmt.Sprintf("%d", quality), + "-density", + "72x72", + outfile, + } + + err := runConvertCommand(args) + if err != nil { + return "", err + } + + return outfile, nil +} + +func ResizePercent(filename string, percent int) (string, error) { + outfile := fmt.Sprintf("%s_rp", filename) + + args := []string{ + filename, + "-resize", + fmt.Sprintf("%d%%", percent), + outfile, + } + + err := runConvertCommand(args) + if err != nil { + return "", err + } + + return outfile, nil +} + +func SquareThumb(filename, name string, size int) (string, error) { + outfile := fmt.Sprintf("%s_%s", filename, name) + + args := []string{ + fmt.Sprintf("%s[0]", filename), + "-quality", + "94", + "-resize", + fmt.Sprintf("%dx%d^", size, size), + "-gravity", + "center", + "-crop", + fmt.Sprintf("%dx%d+0+0", size, size), + "-density", + "72x72", + "-unsharp", + "0.5", + fmt.Sprintf("JPG:%s", outfile), + } + + err := runConvertCommand(args) + if err != nil { + return "", err + } + + return outfile, nil +} + +func Thumb(filename, name string, width, height int) (string, error) { + outfile := fmt.Sprintf("%s_%s", filename, name) + + args := []string{ + fmt.Sprintf("%s[0]", filename), + "-quality", + "83", + "-resize", + fmt.Sprintf("%dx%d>", width, height), + "-density", + "72x72", + fmt.Sprintf("JPG:%s", outfile), + } + + err := runConvertCommand(args) + if err != nil { + return "", err + } + + return outfile, nil +} + +func CircleThumb(filename, name string, width int) (string, error) { + outfile := fmt.Sprintf("%s_%s", filename, name) + + filename, err := Thumb(filename, name, width*2, width*2) + if err != nil { + return "", err + } + + args := []string{ + "-size", + fmt.Sprintf("%dx%d", width, width), + "xc:none", + "-fill", + filename, + "-quality", + "83", + "-density", + "72x72", + "-draw", + fmt.Sprintf("circle %d,%d %d,1", width/2, width/2, width/2), + fmt.Sprintf("PNG:%s", outfile), + } + + err = runConvertCommand(args) + if err != nil { + return "", err + } + + return outfile, nil +} + +func runConvertCommand(args []string) error { + cmd := exec.Command(GM_COMMAND, args...) + + var out bytes.Buffer + var stderr bytes.Buffer + cmd.Stdout = &out + cmd.Stderr = &stderr + + cmd.Start() + + cmdDone := make(chan error, 1) + go func() { + cmdDone <- cmd.Wait() + }() + + select { + case <-time.After(time.Duration(500000) * time.Millisecond): + killCmd(cmd) + <-cmdDone + return errors.New("Command timed out") + case err := <-cmdDone: + if err != nil { + log.Println(stderr.String()) + } + + return err + } + + return nil +} + +func killCmd(cmd *exec.Cmd) { + if err := cmd.Process.Kill(); err != nil { + log.Printf("Failed to kill command: %v", err) + } +} |
