experiments

All kinds of coding experiments
Log | Files | Refs | Submodules

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 }