diff options
Diffstat (limited to 'imageprocessor/imagescaler.go')
| -rw-r--r-- | imageprocessor/imagescaler.go | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/imageprocessor/imagescaler.go b/imageprocessor/imagescaler.go new file mode 100644 index 0000000..2ae5328 --- /dev/null +++ b/imageprocessor/imagescaler.go @@ -0,0 +1,92 @@ +package imageprocessor + +import ( + "errors" + + "mandible/imageprocessor/gm" + "mandible/uploadedfile" +) + +type ImageScaler struct { + targetSize int64 +} + +func (this *ImageScaler) Process(image *uploadedfile.UploadedFile) error { + switch image.GetMime() { + case "image/jpeg", "image/jpg": + return this.scaleJpeg(image) + case "image/png": + return this.scalePng(image) + case "image/gif": + return this.scaleGif(image) + } + + return errors.New("Unsuported filetype") +} + +func (this *ImageScaler) scalePng(image *uploadedfile.UploadedFile) error { + filename, err := gm.ConvertToJpeg(image.GetPath()) + if err != nil { + return err + } + + image.SetPath(filename) + image.SetMime("image/jpeg") + return this.scaleJpeg(image) +} + +func (this *ImageScaler) scaleJpeg(image *uploadedfile.UploadedFile) error { + filename, err := gm.Quality(image.GetPath(), 90) + if err != nil { + return err + } + + image.SetPath(filename) + size, err := image.FileSize() + if size < this.targetSize { + return nil + } + + filename, err = gm.Quality(image.GetPath(), 70) + if err != nil { + return err + } + + image.SetPath(filename) + size, err = image.FileSize() + if size < this.targetSize { + return nil + } + + percent := 90 + if (size - this.targetSize) >= (15 * 1024 * 1024) { + percent = 30 + } else if (size - this.targetSize) >= (10 * 1024 * 1024) { + percent = 40 + } else if (size - this.targetSize) >= (5 * 1024 * 1024) { + percent = 60 + } + + for { + filename, err = gm.ResizePercent(image.GetPath(), percent) + if err != nil { + return err + } + + image.SetPath(filename) + size, err := image.FileSize() + if err != nil { + return err + } else if size == 0 || percent < 10 { + return errors.New("Could not scale image to desired filesize") + } else if size < this.targetSize { + return nil + } + + percent -= 10 + } +} + +func (this *ImageScaler) scaleGif(image *uploadedfile.UploadedFile) error { + return errors.New("Unimplimented") +} |
