Пример #1
0
func main() {

	filepath.Walk("../../../images/", func(path string, info os.FileInfo, err error) error {
		if info.IsDir() {
			return nil
		}

		fmt.Println(path)
		f, err := os.Open(path)
		if err != nil {
			log.Fatal(err)
		}
		defer f.Close()
		// Optionally register camera makenote data parsing - currently Nikon and
		// Canon are supported.
		exif.RegisterParsers(mknote.All...)

		x, err := exif.Decode(f)
		if err != nil {
			log.Fatal(err)
		}

		// Two convenience functions exist for date/time taken and GPS coords:
		tm, _ := x.DateTime()
		fmt.Println("Taken: ", tm)

		lat, long, _ := x.LatLong()
		fmt.Println("lat, long: ", lat, ", ", long)

		return nil
	})
}
Пример #2
0
// Load initializes a Photograph from a file.
func (p *Photograph) Load(fileName string) error {
	p.OriginalFileName = fileName
	fd, err := os.Open(fileName)
	if err != nil {
		logging.Log.Error("%v", err)
		return err
	}
	defer fd.Close()
	exif.RegisterParsers(mknote.All...)
	exifData, err := exif.Decode(fd)
	if err != nil {
		logging.Log.Error("%v", err)
		return err
	}
	err = exifData.Walk(p)
	if err != nil {
		logging.Log.Error("%v", err)
		return err
	}
	offset, err := fd.Seek(0, 0)
	if err != nil {
		logging.Log.Error("%v", err)
		return err
	}
	logging.Log.Debug("offset=%v", offset)
	p.Data, err = ioutil.ReadAll(fd)
	if err != nil {
		logging.Log.Error("%v", err)
		return err
	}

	return nil
}
Пример #3
0
func main() {
	fname := "01.jpg"

	f, err := os.Open(fname)
	if err != nil {
		log.Fatal(err)
	}

	// Optionally register camera makenote data parsing - currently Nikon and
	// Canon are supported.
	exif.RegisterParsers(mknote.All...)

	x, err := exif.Decode(f)
	if err != nil {
		log.Fatal(err)
	}

	camModel, _ := x.Get(exif.Model) // normally, don't ignore errors!
	fmt.Println(camModel.StringVal())

	focal, _ := x.Get(exif.FocalLength)
	numer, denom, _ := focal.Rat2(0) // retrieve first (only) rat. value
	fmt.Printf("%v/%v", numer, denom)

	// Two convenience functions exist for date/time taken and GPS coords:
	tm, _ := x.DateTime()
	fmt.Println("Taken: ", tm)

	lat, long, _ := x.LatLong()
	fmt.Println("lat, long: ", lat, ", ", long)
}
Пример #4
0
func main() {
	flag.Parse()
	roots := flag.Args()

	exif.RegisterParsers(mknote.All...)

	// root := flag.Arg(0)
	if len(roots) == 0 {
		fmt.Printf("Root folder(s) not specified.")
		os.Exit(1)
	}

	for _, root := range roots {
		if _, err := os.Stat(root); os.IsNotExist(err) {
			fmt.Printf("Root folder not found: %s\n", root)
			continue
		}

		err := fswalker.WalkImages(root, visit)
		if err != nil {
			fmt.Printf("WalkImages(%s) returned %v\n", root, err)
		}

		// the bounded walker
		// if err := fswalker.MD5All(root); err != nil {
		// 	fmt.Printf("MD5 error:%v\n", err)
		// }

	}

}
Пример #5
0
func home(res http.ResponseWriter, req *http.Request) {

	type Photo struct {
		PhotoPath string
		Lat       float64
		Long      float64
	}

	var model struct {
		Photos   []Photo
		LoggedIn bool
	}

	session, _ := store.Get(req, "session-name")
	_, model.LoggedIn = session.Values["loggedin"]

	filepath.Walk("assets/imgs", func(path string, info os.FileInfo, err error) error {
		if !info.IsDir() {

			fmt.Println("WALKING", path)

			var currentPhoto Photo

			currentPhoto.PhotoPath = path

			f, err := os.Open(path)
			if err != nil {
				log.Fatal(err)
			}

			exif.RegisterParsers(mknote.All...)

			x, err := exif.Decode(f)
			if err != nil {
				log.Println("no info")
				return nil
			}

			currentPhoto.Lat, currentPhoto.Long, _ = x.LatLong()
			fmt.Println("lat, long: ", currentPhoto.Lat, ", ", currentPhoto.Long)

			model.Photos = append(model.Photos, currentPhoto)
		}
		return nil
	})

	err := tpl.ExecuteTemplate(res, "index.gohtml", model)
	if err != nil {
		http.Error(res, err.Error(), 500)
	}
}
Пример #6
0
func main() {
	flag.Parse()
	fnames := flag.Args()

	if *mnote {
		exif.RegisterParsers(mknote.All...)
	}

	for _, name := range fnames {
		f, err := os.Open(name)
		if err != nil {
			log.Printf("err on %v: %v", name, err)
			continue
		}

		x, err := exif.Decode(f)
		if err != nil {
			log.Printf("err on %v: %v", name, err)
			continue
		}

		if *thumb {
			data, err := x.JpegThumbnail()
			if err != nil {
				log.Fatal("no thumbnail present")
			}
			if _, err := os.Stdout.Write(data); err != nil {
				log.Fatal(err)
			}
			return
		}

		fmt.Printf("\n---- Image '%v' ----\n", name)
		x.Walk(Walker{})
		if x.Comment != "" {
			fmt.Printf("    %v: %v\n", "Comment", x.Comment)
		}
	}
}
Пример #7
0
// Get the EXIF Data from the JPEG
func (img *ImageMeta) GetExif() (*ExifHandler, bool) {

	// Ensure that this is a JPEG
	if !img.IsJPEG() {
		return nil, false
	}

	if f, err := os.Open(img.Path); err == nil {
		defer f.Close()
		exif.RegisterParsers(mknote.All...)

		walker := new(ExifHandler)
		walker.tags = make(map[string]string)

		if x, err := exif.Decode(f); err == nil {
			walker.exif = x
			x.Walk(walker)

			return walker, true
		}
	}

	return nil, false
}
Пример #8
0
func main() {
	fmt.Println("Hello, world")
	fname := "P1070332.JPG"
	rname := "P1070332_rotate.JPG"
	sname := "P1070332_small.JPG"

	f, err := os.Open(fname)
	if err != nil {
		log.Fatal(err)
	}
	defer f.Close()

	// Optionally register camera makenote data parsing - currently Nikon and
	// Canon are supported.
	exif.RegisterParsers(mknote.All...)

	x, err := exif.Decode(f)
	if err != nil {
		log.Fatal(err)
	}

	// Get Orientation
	orientation, err := x.Get(exif.Orientation)
	if err != nil {
		fmt.Println(exif.Model, " not fround")
		return
	}
	fmt.Println("Orientation", orientation.String())

	// Rotate
	var rotateImage *image.NRGBA
	openImage, err := imaging.Open(fname)
	if err != nil {
		fmt.Println(err)
		return
	}
	switch orientation.String() {
	case "1":
	// Do nothing
	case "2":
		rotateImage = imaging.FlipH(openImage)
	case "3":
		rotateImage = imaging.Rotate180(openImage)
	case "4":
		rotateImage = imaging.FlipV(openImage)
	case "5":
		rotateImage = imaging.Transverse(openImage)
	case "6":
		rotateImage = imaging.Rotate270(openImage)
	case "7":
		rotateImage = imaging.Transpose(openImage)
	case "8":
		rotateImage = imaging.Rotate90(openImage)
	}
	err = imaging.Save(rotateImage, rname)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(rname, " saved")

	// Small
	var smallImage *image.NRGBA
	if rotateImage.Rect.Dx() > rotateImage.Rect.Dy() {
		smallImage = imaging.Resize(rotateImage, 1920, 0, imaging.Lanczos)
	} else {
		smallImage = imaging.Resize(rotateImage, 0, 1920, imaging.Lanczos)
	}
	err = imaging.Save(smallImage, sname)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(sname, " saved")

	// Use jpeg.Encode() to write to a file
	// https://github.com/disintegration/imaging/blob/master/helpers.go#L79
	// func Encode(w io.Writer, m image.Image, o *Options) error
	// https://golang.org/pkg/image/jpeg/
}
Пример #9
0
func home(res http.ResponseWriter, req *http.Request) {

	type Photo struct {
		PhotoPath string
		Lat       float64
		Long      float64
	}

	var model struct {
		Photos   []Photo
		LoggedIn bool
	}

	// session
	session, _ := store.Get(req, "session-name")
	_, model.LoggedIn = session.Values["loggedin"]

	filepath.Walk("assets/imgs", func(path string, info os.FileInfo, err error) error {
		if !info.IsDir() {

			fmt.Println("WALKING", path)

			var currentPhoto Photo

			currentPhoto.PhotoPath = path

			// photo lat long
			//			fname := "assets/imgs/us.jpg"

			f, err := os.Open(path)
			if err != nil {
				log.Fatal(err)
			}

			// Optionally register camera makenote data parsing - currently Nikon and
			// Canon are supported.
			exif.RegisterParsers(mknote.All...)

			x, err := exif.Decode(f)
			if err != nil {
				log.Println("no info")
				return nil
			}

			//			camModel, _ := x.Get(exif.Model) // normally, don't ignore errors!
			//			fmt.Println(camModel.StringVal())
			//
			//			focal, _ := x.Get(exif.FocalLength)
			//			numer, denom, _ := focal.Rat2(0) // retrieve first (only) rat. value
			//			fmt.Printf("%v/%v", numer, denom)
			//
			//			// Two convenience functions exist for date/time taken and GPS coords:
			//			tm, _ := x.DateTime()
			//			fmt.Println("Taken: ", tm)

			currentPhoto.Lat, currentPhoto.Long, _ = x.LatLong()
			fmt.Println("lat, long: ", currentPhoto.Lat, ", ", currentPhoto.Long)

			model.Photos = append(model.Photos, currentPhoto)
		}
		return nil
	})

	err := tpl.ExecuteTemplate(res, "index.gohtml", model)
	if err != nil {
		http.Error(res, err.Error(), 500)
	}
}