mirror of
https://github.com/dsoprea/go-exif.git
synced 2025-05-31 11:41:57 +00:00
- Added some assertions and constants. Renamed from variable so it'd be easy to tell if the byte-arrays, even though they come directly from the EXIF, which specific offsets they start at (so no remove for confusion during enumeration and building).
99 lines
2.4 KiB
Go
99 lines
2.4 KiB
Go
package main
|
|
|
|
import (
|
|
"os"
|
|
"fmt"
|
|
"flag"
|
|
|
|
"io/ioutil"
|
|
|
|
"github.com/dsoprea/go-logging"
|
|
"github.com/dsoprea/go-exif"
|
|
)
|
|
|
|
var (
|
|
filepathArgument = ""
|
|
)
|
|
|
|
func main() {
|
|
defer func() {
|
|
if state := recover(); state != nil {
|
|
err := log.Wrap(state.(error))
|
|
log.PrintErrorf(err, "Program error.")
|
|
}
|
|
}()
|
|
|
|
flag.StringVar(&filepathArgument, "filepath", "", "File-path of image.")
|
|
|
|
flag.Parse()
|
|
|
|
if filepathArgument == "" {
|
|
fmt.Printf("Please provide a file-path for an image.\n")
|
|
os.Exit(1)
|
|
}
|
|
|
|
f, err := os.Open(filepathArgument)
|
|
log.PanicIf(err)
|
|
|
|
data, err := ioutil.ReadAll(f)
|
|
log.PanicIf(err)
|
|
|
|
e := exif.NewExif()
|
|
|
|
foundAt := -1
|
|
for i := 0; i < len(data); i++ {
|
|
if exif.IsExif(data[i:i + 6]) == true {
|
|
foundAt = i
|
|
break
|
|
}
|
|
}
|
|
|
|
if foundAt == -1 {
|
|
fmt.Printf("EXIF data not found.\n")
|
|
os.Exit(-1)
|
|
}
|
|
|
|
// Run the parse.
|
|
|
|
ti := exif.NewTagIndex()
|
|
visitor := func(indexedIfdName string, tagId uint16, tagType exif.TagType, valueContext exif.ValueContext) (err error) {
|
|
defer func() {
|
|
if state := recover(); state != nil {
|
|
err = log.Wrap(state.(error))
|
|
log.Panic(err)
|
|
}
|
|
}()
|
|
|
|
it, err := ti.Get(indexedIfdName, tagId)
|
|
if err != nil {
|
|
if log.Is(err, exif.ErrTagNotFound) {
|
|
fmt.Printf("WARNING: Unknown tag: [%s] (%04x)\n", indexedIfdName, tagId)
|
|
return nil
|
|
} else {
|
|
log.Panic(err)
|
|
}
|
|
}
|
|
|
|
valueString := ""
|
|
if tagType.Type() == exif.TypeUndefined {
|
|
value, err := exif.UndefinedValue(indexedIfdName, tagId, valueContext, tagType.ByteOrder())
|
|
if log.Is(err, exif.ErrUnhandledUnknownTypedTag) {
|
|
valueString = "!UNDEFINED!"
|
|
} else if err != nil {
|
|
log.Panic(err)
|
|
} else {
|
|
valueString = fmt.Sprintf("%v", value)
|
|
}
|
|
} else {
|
|
valueString, err = tagType.ValueString(valueContext, true)
|
|
log.PanicIf(err)
|
|
}
|
|
|
|
fmt.Printf("IFD=[%s] ID=(0x%04x) NAME=[%s] COUNT=(%d) TYPE=[%s] VALUE=[%s]\n", indexedIfdName, tagId, it.Name, valueContext.UnitCount, tagType.Name(), valueString)
|
|
return nil
|
|
}
|
|
|
|
err = e.Visit(data[foundAt:], visitor)
|
|
log.PanicIf(err)
|
|
}
|