main.go (1686B)
1 package main 2 3 import ( 4 "bufio" 5 "fmt" 6 "github.com/edwvee/exiffix" 7 "golang.org/x/image/draw" 8 "image" 9 "image/jpeg" 10 "os" 11 "time" 12 ) 13 14 // scale image. Thanks: https://github.com/nfnt/resize/issues/63#issuecomment-540704731 15 func scaleImg(src image.Image, rect image.Rectangle, scale draw.Scaler) image.Image { 16 dst := image.NewRGBA(rect) 17 scale.Scale(dst, rect, src, src.Bounds(), draw.Over, nil) 18 return dst 19 } 20 21 func thumbnail(src image.Image, maxW, maxH int, scale draw.Scaler) image.Image { 22 var ( 23 scalar float64 = 1 24 w = float64(src.Bounds().Max.X) 25 h = float64(src.Bounds().Max.Y) 26 ) 27 if w > float64(maxW) { 28 scalar = float64(maxW) / w 29 } 30 if scalar*h > float64(maxH) { 31 scalar = float64(maxH) / h 32 } 33 return scaleImg(src, image.Rect(0, 0, int(scalar*w), int(scalar*h)), draw.ApproxBiLinear) 34 } 35 36 func main() { 37 start := time.Now() 38 if len(os.Args) < 2 { 39 fmt.Println("No img file given") 40 os.Exit(1) 41 } 42 imgFile, err := os.Open(os.Args[1]) 43 if err != nil { 44 fmt.Println("Error when reading:", err) 45 os.Exit(1) 46 } 47 defer imgFile.Close() 48 fmt.Println("Opened", time.Since(start)) 49 start = time.Now() 50 img, _, err := exiffix.Decode(imgFile) 51 if err != nil { 52 fmt.Println("Error when decoding:", err) 53 os.Exit(1) 54 } 55 fmt.Println("Decoded", time.Since(start)) 56 start = time.Now() 57 of, err := os.Create("output.jpg") 58 if err != nil { 59 fmt.Println("Error when opening output file:", err) 60 os.Exit(1) 61 } 62 newImg := thumbnail(img, 200, 200, draw.ApproxBiLinear) 63 fmt.Println("Processed", time.Since(start)) 64 start = time.Now() 65 imageWriter := bufio.NewWriter(of) 66 err = jpeg.Encode(imageWriter, newImg, nil) 67 fmt.Println("Written", time.Since(start)) 68 }