patterngoMinor
Image Cropping and Resizing
Viewed 0 times
andimagecroppingresizing
Problem
I am building a Go based image processing worker for my web application. I am trying to be idiomatic, but I am new to Go. Any feedback, is appreciated. This program uses bimg to generate 4 square images based on top, left, width, height, which come from a client side cropping library (croppie.js)
package main
import (
"log"
"os"
"fmt"
"strings"
"gopkg.in/h2non/bimg.v1"
)
var sizes = [3]int{128, 256, 512}
func resizeImage(img []byte, width int, height int, name string) (err error){
options := bimg.Options{
Width: width,
Height: height,
}
var thumb []byte
thumb, err = bimg.Resize(img, options)
if err != nil {
log.Println(os.Stderr, err)
return err
}
err = bimg.Write(name, thumb)
return
}
func processImage(top, left, width, height int, filename string) (err error){
var buffer, original []byte
var image *bimg.Image
var fileBaseName = strings.Split(filename, ".")[0]
buffer, err = bimg.Read(filename)
if err != nil {
log.Println(os.Stderr, err)
}
image = bimg.NewImage(buffer)
original, err = image.Extract(left, top, width, height)
if err != nil {
return err
}
err = bimg.Write(fileBaseName + "_original.jpg", original)
if err != nil {
return err
}
for i := 0; i < len(sizes); i++ {
size := sizes[i]
err = resizeImage(original, size, size, fmt.Sprintf(fileBaseName + "_%d.jpg", size))
if(err != nil){
log.Println(os.Stderr, err)
return err
}
}
return
}
func main() {
err := processImage(50,50,400,400, "test2.jpeg")
if(err != nil){
log.Println(os.Stderr, err)
}
}Solution
Use
The loop over sizes doesn't use the loop index, so it can be written more idiomatically using
Variable declarations
At many places you declare variables at the top of the function. This is neither necessary not recommended. It's best to declare variables right before you need them, not sooner.
Related to this, most functions use a named return value. This can be useful sometimes. But in the posted code, most of the time you return a value explicitly, and only use a parameterless
Lastly, in
Logging
I don't understand what
Formatting
The code doesn't follow the standard at a few places. Run
rangeThe loop over sizes doesn't use the loop index, so it can be written more idiomatically using
range:for _, size := range sizes {
// ...
}Variable declarations
At many places you declare variables at the top of the function. This is neither necessary not recommended. It's best to declare variables right before you need them, not sooner.
Related to this, most functions use a named return value. This can be useful sometimes. But in the posted code, most of the time you return a value explicitly, and only use a parameterless
return at the end of functions, so you might as well drop the naming and return nil where you need it.Lastly, in
resizeImage signature, you could shorten width int, height int like you already did in other functions.Logging
I don't understand what
os.Stderr is doing in the calls to log.Println. This function will write to standard error the parameters passed to fmt.Sprintf. If you want to log to standard error, you can replace log.Println(os.Stderr, err) with simply log.Println(err). The os.Stderr is not doing anything useful there, I suspect it was a symbol mistake.Formatting
The code doesn't follow the standard at a few places. Run
go fmt to fix it.Code Snippets
for _, size := range sizes {
// ...
}Context
StackExchange Code Review Q#143886, answer score: 4
Revisions (0)
No revisions yet.