drewnoakes / metadata-extractor

Extracts Exif, IPTC, XMP, ICC and other metadata from image, video and audio files
Apache License 2.0
2.55k stars 479 forks source link

processAppleRunTime java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Byte #553

Open shalk opened 2 years ago

shalk commented 2 years ago

the exception info is as follow

https://github.com/drewnoakes/metadata-extractor/blob/2.16.0/Source/com/drew/metadata/exif/ExifTiffHandler.java#L385

Exception Stack:
    at com.drew.metadata.exif.ExifTiffHandler.processAppleRunTime(ExifTiffHandler.java:385)
    at com.drew.metadata.exif.ExifTiffHandler.customProcessTag(ExifTiffHandler.java:251)
    at com.drew.imaging.tiff.TiffReader.processIfd(TiffReader.java:220)
    at com.drew.metadata.exif.ExifTiffHandler.processMakernote(ExifTiffHandler.java:645)
    at com.drew.metadata.exif.ExifTiffHandler.customProcessTag(ExifTiffHandler.java:207)
    at com.drew.imaging.tiff.TiffReader.processIfd(TiffReader.java:220)
    at com.drew.imaging.tiff.TiffReader.processIfd(TiffReader.java:214)
    at com.drew.imaging.tiff.TiffReader.processTiff(TiffReader.java:78)
    at com.drew.metadata.exif.ExifReader.extract(ExifReader.java:94)
    at com.drew.metadata.exif.ExifReader.extract(ExifReader.java:84)
    at com.drew.metadata.exif.ExifReader.readJpegSegments(ExifReader.java:63)
    at com.drew.imaging.jpeg.JpegMetadataReader.processJpegSegmentData(JpegMetadataReader.java:134)
    at com.drew.imaging.jpeg.JpegMetadataReader.process(JpegMetadataReader.java:126)
    at com.drew.imaging.jpeg.JpegMetadataReader.readMetadata(JpegMetadataReader.java:77)
    at com.drew.imaging.jpeg.JpegMetadataReader.readMetadata(JpegMetadataReader.java:84)
    at com.drew.imaging.ImageMetadataReader.readMetadata(ImageMetadataReader.java:146)
    at com.drew.imaging.ImageMetadataReader.readMetadata(ImageMetadataReader.java:124)
    at com.drew.imaging.ImageMetadataReader.readMetadata(ImageMetadataReader.java:103)

byte flags = (Byte)values.get("flags");

I have debug into the line. the value of "flags" is "1" ,type is char[]

is Byte.parseByte(values.get("flags").toString()) right?

drewnoakes commented 2 years ago

@shalk thanks for filing this. Can you share an image that reproduces this issue?

It may be that the value is sometimes a string, and sometimes a Byte. I would prefer to only parse when the value is actually a string.

nosnhojbob commented 2 years ago

echo @drewnoakes' request for source image. I had only seen similar problems when the BPLIST was malformed or un-parsable. The top object is expected to be a map of bytes (a dict by the marker).

nnl-1 commented 2 years ago

Also have an error while reading exif: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long at com.drew.metadata.apple.AppleRunTimeReader.processAppleRunTime(AppleRunTimeReader.java:75) version: 2.18.0 file attached. sample