mirror of https://github.com/dsoprea/go-exif.git
ifd_builder: Added test for tag update.
- Added get-thumbnail and update-tag examples.pull/3/head
parent
abbf7e0d92
commit
6a9c7f28b1
|
@ -1393,6 +1393,10 @@ func Test_IfdBuilder_CreateIfdBuilderFromExistingChain_RealData(t *testing.T) {
|
||||||
// that the thumbnail tags are not kept but only produced on the fly, which
|
// that the thumbnail tags are not kept but only produced on the fly, which
|
||||||
// is why we check it above.
|
// is why we check it above.
|
||||||
|
|
||||||
|
if len(recoveredTags) != len(originalTags) {
|
||||||
|
t.Fatalf("Recovered tag-count does not match original.")
|
||||||
|
}
|
||||||
|
|
||||||
for i, recoveredIte := range recoveredTags {
|
for i, recoveredIte := range recoveredTags {
|
||||||
if recoveredIte.ChildIfdName != "" {
|
if recoveredIte.ChildIfdName != "" {
|
||||||
continue
|
continue
|
||||||
|
@ -1420,136 +1424,222 @@ func Test_IfdBuilder_CreateIfdBuilderFromExistingChain_RealData(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// func Test_IfdBuilder_CreateIfdBuilderFromExistingChain_RealData_WithUpdate(t *testing.T) {
|
func Test_IfdBuilder_CreateIfdBuilderFromExistingChain_RealData_WithUpdate(t *testing.T) {
|
||||||
// filepath := path.Join(assetsPath, "NDM_8901.jpg")
|
filepath := path.Join(assetsPath, "NDM_8901.jpg")
|
||||||
|
|
||||||
// e := NewExif()
|
e := NewExif()
|
||||||
|
|
||||||
|
|
||||||
// rawExif, err := e.SearchAndExtractExif(filepath)
|
rawExif, err := e.SearchAndExtractExif(filepath)
|
||||||
// log.PanicIf(err)
|
log.PanicIf(err)
|
||||||
|
|
||||||
// // Decode from binary.
|
// Decode from binary.
|
||||||
|
|
||||||
// _, originalIndex, err := e.Collect(rawExif)
|
_, originalIndex, err := e.Collect(rawExif)
|
||||||
// log.PanicIf(err)
|
log.PanicIf(err)
|
||||||
|
|
||||||
// originalThumbnailData, err := originalIndex.RootIfd.NextIfd.Thumbnail()
|
originalThumbnailData, err := originalIndex.RootIfd.NextIfd.Thumbnail()
|
||||||
// log.PanicIf(err)
|
log.PanicIf(err)
|
||||||
|
|
||||||
// originalTags := originalIndex.RootIfd.DumpTags()
|
originalTags := originalIndex.RootIfd.DumpTags()
|
||||||
|
|
||||||
|
|
||||||
// // Encode back to binary.
|
// Encode back to binary.
|
||||||
|
|
||||||
// ibe := NewIfdByteEncoder()
|
ibe := NewIfdByteEncoder()
|
||||||
|
|
||||||
// itevr := NewIfdTagEntryValueResolver(rawExif, originalIndex.RootIfd.ByteOrder)
|
itevr := NewIfdTagEntryValueResolver(rawExif, originalIndex.RootIfd.ByteOrder)
|
||||||
// rootIb := NewIfdBuilderFromExistingChain(originalIndex.RootIfd, itevr)
|
rootIb := NewIfdBuilderFromExistingChain(originalIndex.RootIfd, itevr)
|
||||||
|
|
||||||
|
|
||||||
// // Update a tag,.
|
// Update a tag,.
|
||||||
|
|
||||||
// exifBt, err := rootIb.FindWithName("ExifTag")
|
exifBt, err := rootIb.FindTagWithName("ExifTag")
|
||||||
// log.PanicIf(err)
|
log.PanicIf(err)
|
||||||
|
|
||||||
// ucBt, err := exifBt.value.Ib().FindWithName("UserComment")
|
ucBt, err := exifBt.value.Ib().FindTagWithName("UserComment")
|
||||||
// log.PanicIf(err)
|
log.PanicIf(err)
|
||||||
|
|
||||||
// err = ucBt.SetValue(rootIb.ByteOrder, "TEST CHANGE")
|
// TODO(dustin): !! Create an example for this.
|
||||||
// log.PanicIf(err)
|
uc := TagUnknownType_9298_UserComment{
|
||||||
|
EncodingType: TagUnknownType_9298_UserComment_Encoding_ASCII,
|
||||||
|
EncodingBytes: []byte("TEST COMMENT"),
|
||||||
|
}
|
||||||
|
|
||||||
|
err = ucBt.SetValue(rootIb.byteOrder, uc)
|
||||||
|
log.PanicIf(err)
|
||||||
|
|
||||||
|
|
||||||
// // Encode.
|
// Encode.
|
||||||
|
|
||||||
// updatedExif, err := ibe.EncodeToExif(rootIb)
|
updatedExif, err := ibe.EncodeToExif(rootIb)
|
||||||
// log.PanicIf(err)
|
log.PanicIf(err)
|
||||||
|
|
||||||
|
|
||||||
// // Parse again.
|
// Parse again.
|
||||||
|
|
||||||
// _, recoveredIndex, err := e.Collect(updatedExif)
|
_, recoveredIndex, err := e.Collect(updatedExif)
|
||||||
// log.PanicIf(err)
|
log.PanicIf(err)
|
||||||
|
|
||||||
// recoveredTags := recoveredIndex.RootIfd.DumpTags()
|
recoveredTags := recoveredIndex.RootIfd.DumpTags()
|
||||||
|
|
||||||
|
|
||||||
// recoveredThumbnailData, err := recoveredIndex.RootIfd.NextIfd.Thumbnail()
|
recoveredThumbnailData, err := recoveredIndex.RootIfd.NextIfd.Thumbnail()
|
||||||
// log.PanicIf(err)
|
log.PanicIf(err)
|
||||||
|
|
||||||
|
|
||||||
// // Check the thumbnail.
|
// Check the thumbnail.
|
||||||
|
|
||||||
// if bytes.Compare(recoveredThumbnailData, originalThumbnailData) != 0 {
|
if bytes.Compare(recoveredThumbnailData, originalThumbnailData) != 0 {
|
||||||
// t.Fatalf("recovered thumbnail does not match original")
|
t.Fatalf("recovered thumbnail does not match original")
|
||||||
// }
|
}
|
||||||
|
|
||||||
|
|
||||||
// // Validate that all of the same IFDs were presented.
|
// Validate that all of the same IFDs were presented.
|
||||||
|
|
||||||
// originalIfdTags := make([][2]interface{}, 0)
|
originalIfdTags := make([][2]interface{}, 0)
|
||||||
// for _, ite := range originalTags {
|
for _, ite := range originalTags {
|
||||||
// if ite.ChildIfdName != "" {
|
if ite.ChildIfdName != "" {
|
||||||
// originalIfdTags = append(originalIfdTags, [2]interface{} { ite.Ii, ite.TagId })
|
originalIfdTags = append(originalIfdTags, [2]interface{} { ite.Ii, ite.TagId })
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
|
|
||||||
// recoveredIfdTags := make([][2]interface{}, 0)
|
recoveredIfdTags := make([][2]interface{}, 0)
|
||||||
// for _, ite := range recoveredTags {
|
for _, ite := range recoveredTags {
|
||||||
// if ite.ChildIfdName != "" {
|
if ite.ChildIfdName != "" {
|
||||||
// recoveredIfdTags = append(recoveredIfdTags, [2]interface{} { ite.Ii, ite.TagId })
|
recoveredIfdTags = append(recoveredIfdTags, [2]interface{} { ite.Ii, ite.TagId })
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
|
|
||||||
// if reflect.DeepEqual(recoveredIfdTags, originalIfdTags) != true {
|
if reflect.DeepEqual(recoveredIfdTags, originalIfdTags) != true {
|
||||||
// fmt.Printf("Original IFD tags:\n\n")
|
fmt.Printf("Original IFD tags:\n\n")
|
||||||
|
|
||||||
// for i, x := range originalIfdTags {
|
for i, x := range originalIfdTags {
|
||||||
// fmt.Printf(" %02d %v\n", i, x)
|
fmt.Printf(" %02d %v\n", i, x)
|
||||||
// }
|
}
|
||||||
|
|
||||||
// fmt.Printf("\nRecovered IFD tags:\n\n")
|
fmt.Printf("\nRecovered IFD tags:\n\n")
|
||||||
|
|
||||||
// for i, x := range recoveredIfdTags {
|
for i, x := range recoveredIfdTags {
|
||||||
// fmt.Printf(" %02d %v\n", i, x)
|
fmt.Printf(" %02d %v\n", i, x)
|
||||||
// }
|
}
|
||||||
|
|
||||||
// fmt.Printf("\n")
|
fmt.Printf("\n")
|
||||||
|
|
||||||
// t.Fatalf("Recovered IFD tags are not correct.")
|
t.Fatalf("Recovered IFD tags are not correct.")
|
||||||
// }
|
}
|
||||||
|
|
||||||
|
|
||||||
// // Validate that all of the tags owned by the IFDs were presented. Note
|
// Validate that all of the tags owned by the IFDs were presented. Note
|
||||||
// // that the thumbnail tags are not kept but only produced on the fly, which
|
// that the thumbnail tags are not kept but only produced on the fly, which
|
||||||
// // is why we check it above.
|
// is why we check it above.
|
||||||
|
|
||||||
// for i, recoveredIte := range recoveredTags {
|
if len(recoveredTags) != len(originalTags) {
|
||||||
// if recoveredIte.ChildIfdName != "" {
|
t.Fatalf("Recovered tag-count does not match original.")
|
||||||
// continue
|
}
|
||||||
// }
|
|
||||||
|
|
||||||
// originalIte := originalTags[i]
|
for i, recoveredIte := range recoveredTags {
|
||||||
|
if recoveredIte.ChildIfdName != "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
// if recoveredIte.Ii != originalIte.Ii {
|
originalIte := originalTags[i]
|
||||||
// t.Fatalf("IfdIdentify not as expected: %s != %s ITE=%s", recoveredIte.Ii, originalIte.Ii, recoveredIte)
|
|
||||||
// } else if recoveredIte.TagId != originalIte.TagId {
|
|
||||||
// t.Fatalf("Tag-ID not as expected: %s != %s ITE=%s", recoveredIte.TagId, originalIte.TagId, recoveredIte)
|
|
||||||
// } else if recoveredIte.TagType != originalIte.TagType {
|
|
||||||
// t.Fatalf("Tag-type not as expected: %d != %d ITE=%s", recoveredIte.TagType, originalIte.TagType, recoveredIte)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// originalValueBytes, err := originalIte.ValueBytes(originalIndex.RootIfd.addressableData, originalIndex.RootIfd.ByteOrder)
|
if recoveredIte.Ii != originalIte.Ii {
|
||||||
// log.PanicIf(err)
|
t.Fatalf("IfdIdentify not as expected: %s != %s ITE=%s", recoveredIte.Ii, originalIte.Ii, recoveredIte)
|
||||||
|
} else if recoveredIte.TagId != originalIte.TagId {
|
||||||
|
t.Fatalf("Tag-ID not as expected: %s != %s ITE=%s", recoveredIte.TagId, originalIte.TagId, recoveredIte)
|
||||||
|
} else if recoveredIte.TagType != originalIte.TagType {
|
||||||
|
t.Fatalf("Tag-type not as expected: %d != %d ITE=%s", recoveredIte.TagType, originalIte.TagType, recoveredIte)
|
||||||
|
}
|
||||||
|
|
||||||
// recoveredValueBytes, err := recoveredIte.ValueBytes(recoveredIndex.RootIfd.addressableData, recoveredIndex.RootIfd.ByteOrder)
|
originalValueBytes, err := originalIte.ValueBytes(originalIndex.RootIfd.addressableData, originalIndex.RootIfd.ByteOrder)
|
||||||
// log.PanicIf(err)
|
log.PanicIf(err)
|
||||||
|
|
||||||
// if bytes.Compare(originalValueBytes, recoveredValueBytes) != 0 {
|
recoveredValueBytes, err := recoveredIte.ValueBytes(recoveredIndex.RootIfd.addressableData, recoveredIndex.RootIfd.ByteOrder)
|
||||||
// t.Fatalf("bytes of tag content not correct: %s != %s", originalIte, recoveredIte)
|
log.PanicIf(err)
|
||||||
// }
|
|
||||||
// }
|
if recoveredIte.TagId == 0x9286 {
|
||||||
// }
|
expectedValueBytes := make([]byte, 0)
|
||||||
|
|
||||||
|
expectedValueBytes = append(expectedValueBytes, []byte{ 'A', 'S', 'C', 'I', 'I', 0, 0, 0 }...)
|
||||||
|
expectedValueBytes = append(expectedValueBytes, []byte("TEST COMMENT")...)
|
||||||
|
|
||||||
|
if bytes.Compare(recoveredValueBytes, expectedValueBytes) != 0 {
|
||||||
|
t.Fatalf("Recovered UserComment does not have the right value: %v != %v", recoveredValueBytes, expectedValueBytes)
|
||||||
|
}
|
||||||
|
} else if bytes.Compare(recoveredValueBytes, originalValueBytes) != 0 {
|
||||||
|
t.Fatalf("bytes of tag content not correct: %v != %v ITE=%s", recoveredValueBytes, originalValueBytes, recoveredIte)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExampleReadThumbnail() {
|
||||||
|
filepath := path.Join(assetsPath, "NDM_8901.jpg")
|
||||||
|
|
||||||
|
e := NewExif()
|
||||||
|
|
||||||
|
rawExif, err := e.SearchAndExtractExif(filepath)
|
||||||
|
log.PanicIf(err)
|
||||||
|
|
||||||
|
_, index, err := e.Collect(rawExif)
|
||||||
|
log.PanicIf(err)
|
||||||
|
|
||||||
|
thumbnailData, err := index.RootIfd.NextIfd.Thumbnail()
|
||||||
|
log.PanicIf(err)
|
||||||
|
|
||||||
|
thumbnailData = thumbnailData
|
||||||
|
// Output:
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExampleUpdateUnknownTag() {
|
||||||
|
filepath := path.Join(assetsPath, "NDM_8901.jpg")
|
||||||
|
|
||||||
|
e := NewExif()
|
||||||
|
|
||||||
|
rawExif, err := e.SearchAndExtractExif(filepath)
|
||||||
|
log.PanicIf(err)
|
||||||
|
|
||||||
|
_, index, err := e.Collect(rawExif)
|
||||||
|
log.PanicIf(err)
|
||||||
|
|
||||||
|
|
||||||
|
// Create builder.
|
||||||
|
|
||||||
|
itevr := NewIfdTagEntryValueResolver(rawExif, index.RootIfd.ByteOrder)
|
||||||
|
rootIb := NewIfdBuilderFromExistingChain(index.RootIfd, itevr)
|
||||||
|
|
||||||
|
|
||||||
|
// Find tag to update.
|
||||||
|
|
||||||
|
exifBt, err := rootIb.FindTagWithName("ExifTag")
|
||||||
|
log.PanicIf(err)
|
||||||
|
|
||||||
|
ucBt, err := exifBt.value.Ib().FindTagWithName("UserComment")
|
||||||
|
log.PanicIf(err)
|
||||||
|
|
||||||
|
|
||||||
|
// Update the value. Since this is an "undefined"-type tag, we have to use
|
||||||
|
// its type-specific struct.
|
||||||
|
|
||||||
|
uc := TagUnknownType_9298_UserComment{
|
||||||
|
EncodingType: TagUnknownType_9298_UserComment_Encoding_ASCII,
|
||||||
|
EncodingBytes: []byte("TEST COMMENT"),
|
||||||
|
}
|
||||||
|
|
||||||
|
err = ucBt.SetValue(rootIb.byteOrder, uc)
|
||||||
|
log.PanicIf(err)
|
||||||
|
|
||||||
|
|
||||||
|
// Encode.
|
||||||
|
|
||||||
|
ibe := NewIfdByteEncoder()
|
||||||
|
updatedExif, err := ibe.EncodeToExif(rootIb)
|
||||||
|
log.PanicIf(err)
|
||||||
|
|
||||||
|
updatedExif = updatedExif
|
||||||
|
// Output:
|
||||||
|
}
|
||||||
|
|
||||||
func Test_IfdBuilder_CreateIfdBuilderWithExistingIfd(t *testing.T) {
|
func Test_IfdBuilder_CreateIfdBuilderWithExistingIfd(t *testing.T) {
|
||||||
tagId := IfdTagIdWithIdentityOrFail(GpsIi)
|
tagId := IfdTagIdWithIdentityOrFail(GpsIi)
|
||||||
|
|
Loading…
Reference in New Issue