[JAVA] Read JPEG Exif information ~ metadata-extractor ~

I used a convenient library called metadata-extractor when creating a process to read Exif in Java / Android. Since metadata-extractor is read-only, you can delete, add, or modify Exif information using another library or implement it yourself.

How to use

String path = "c:\image\img0001.jpg ";   //File Path
File jpegFile = new File(path);

//Get meta information
Metadata metadata = ImageMetadataReader.readMetadata(jpegFile);

//Full display of Exif information
for (Directory directory : metadata.getDirectories()) {
    for (Tag tag : directory.getTags()) {
        System.out.println(tag);
    }
}

Output values individually

Click here to output the values individually.

public static void Main(String[] args) {

    String path = "c:\image\img0001.jpg ";   //File Path
    File jpegFile = new File(path);

    //Get meta information
    Metadata metadata = ImageMetadataReader.readMetadata(jpegFile);


    // JPEG/TIFF(Not compatible)
    JpegDirectory jpegDirectory = metadata.getFirstDirectoryOfType(JpegDirectory.class);
    if (jpegDirectory != null) {
        for (Tag tag : jpegDirectory.getTags()) {
            getJpegTag(tag);
        }
    }

    //Get IFD0 information
    ExifIFD0Directory ifdDirectory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);
    if( ifdDirectory != null ) {
        for (Tag tag : ifdDirectory.getTags()) {
            getExifTag(tag);
        }
    }

    //Get SubIFD information
    ExifSubIFDDirectory subIfdDirectory = metadata.getFirstDirectoryOfType(ExifSubIFDDirectory.class);
    if( subIfdDirectory!=null ) {
        for (Tag tag : subIfdDirectory.getTags()) {
            getExifTag(tag);
        }
    }

    //Get Thumbnail information
    ExifThumbnailDirectory thumbnailDirectory = metadata.getFirstDirectoryOfType(ExifThumbnailDirectory.class);
    if (thumbnailDirectory != null) {
        for (Tag tag : thumbnailDirectory.getTags()) {
            getExifTag(tag);
        }
    }

    //Get GPS information
    GpsDirectory gpsDirectory = metadata.getFirstDirectoryOfType(GpsDirectory.class);
    if( gpsDirectory!=null ) {
        for (Tag tag : gpsDirectory.getTags()) {
            getGPSTag(tag);
        }
    }
}

//All Jpeg tags
private void getJpegTag(Tag tag) {
    switch (tag.getTagType()) {
        case JpegDirectory.TAG_COMPRESSION_TYPE:
        case JpegDirectory.TAG_DATA_PRECISION:
        case JpegDirectory.TAG_IMAGE_WIDTH:
        case JpegDirectory.TAG_IMAGE_HEIGHT:
        case JpegDirectory.TAG_NUMBER_OF_COMPONENTS:
        case JpegDirectory.TAG_COMPONENT_DATA_1:
        case JpegDirectory.TAG_COMPONENT_DATA_2:
        case JpegDirectory.TAG_COMPONENT_DATA_3:
        case JpegDirectory.TAG_COMPONENT_DATA_4:
        default:
            //Perform processing in the required case
            System.out.println(tag.getTagName, tag.getDescription()));
            break;
    }
}

//All Exif tags
private void getExifTag(Tag tag) {
    switch (tag.getTagType()) {
        switch (tag.getTagType()) {
            case ExifDirectoryBase.TAG_INTEROP_INDEX:
            case ExifDirectoryBase.TAG_INTEROP_VERSION:
            case ExifDirectoryBase.TAG_NEW_SUBFILE_TYPE:
            case ExifDirectoryBase.TAG_SUBFILE_TYPE:
            case ExifDirectoryBase.TAG_IMAGE_WIDTH:
            case ExifDirectoryBase.TAG_IMAGE_HEIGHT:
            case ExifDirectoryBase.TAG_BITS_PER_SAMPLE:
            case ExifDirectoryBase.TAG_COMPRESSION:
            case ExifDirectoryBase.TAG_PHOTOMETRIC_INTERPRETATION:
            case ExifDirectoryBase.TAG_THRESHOLDING:
            case ExifDirectoryBase.TAG_FILL_ORDER:
            case ExifDirectoryBase.TAG_DOCUMENT_NAME:
            case ExifDirectoryBase.TAG_IMAGE_DESCRIPTION:
            case ExifDirectoryBase.TAG_MAKE:
            case ExifDirectoryBase.TAG_MODEL:
            case ExifDirectoryBase.TAG_STRIP_OFFSETS:
            case ExifDirectoryBase.TAG_ORIENTATION:
            case ExifDirectoryBase.TAG_SAMPLES_PER_PIXEL:
            case ExifDirectoryBase.TAG_ROWS_PER_STRIP:
            case ExifDirectoryBase.TAG_STRIP_BYTE_COUNTS:
            case ExifDirectoryBase.TAG_MIN_SAMPLE_VALUE:
            case ExifDirectoryBase.TAG_MAX_SAMPLE_VALUE:
            case ExifDirectoryBase.TAG_X_RESOLUTION:
            case ExifDirectoryBase.TAG_Y_RESOLUTION:
            case ExifDirectoryBase.TAG_PLANAR_CONFIGURATION:
            case ExifDirectoryBase.TAG_PAGE_NAME:
            case ExifDirectoryBase.TAG_RESOLUTION_UNIT:
            case ExifDirectoryBase.TAG_TRANSFER_FUNCTION:
            case ExifDirectoryBase.TAG_SOFTWARE:
            case ExifDirectoryBase.TAG_DATETIME:
            case ExifDirectoryBase.TAG_ARTIST:
            case ExifDirectoryBase.TAG_HOST_COMPUTER:
            case ExifDirectoryBase.TAG_PREDICTOR:
            case ExifDirectoryBase.TAG_WHITE_POINT:
            case ExifDirectoryBase.TAG_PRIMARY_CHROMATICITIES:
            case ExifDirectoryBase.TAG_TILE_WIDTH:
            case ExifDirectoryBase.TAG_TILE_LENGTH:
            case ExifDirectoryBase.TAG_TILE_OFFSETS:
            case ExifDirectoryBase.TAG_TILE_BYTE_COUNTS:
            case ExifDirectoryBase.TAG_SUB_IFD_OFFSET:
            case ExifDirectoryBase.TAG_TRANSFER_RANGE:
            case ExifDirectoryBase.TAG_JPEG_TABLES:
            case ExifDirectoryBase.TAG_JPEG_PROC:
            case ExifDirectoryBase.TAG_YCBCR_COEFFICIENTS:
            case ExifDirectoryBase.TAG_YCBCR_SUBSAMPLING:
            case ExifDirectoryBase.TAG_YCBCR_POSITIONING:
            case ExifDirectoryBase.TAG_REFERENCE_BLACK_WHITE:
            case ExifDirectoryBase.TAG_STRIP_ROW_COUNTS:
            case ExifDirectoryBase.TAG_APPLICATION_NOTES:
            case ExifDirectoryBase.TAG_RELATED_IMAGE_FILE_FORMAT:
            case ExifDirectoryBase.TAG_RELATED_IMAGE_WIDTH:
            case ExifDirectoryBase.TAG_RELATED_IMAGE_HEIGHT:
            case ExifDirectoryBase.TAG_RATING:
            case ExifDirectoryBase.TAG_CFA_REPEAT_PATTERN_DIM:
            case ExifDirectoryBase.TAG_CFA_PATTERN_2:
            case ExifDirectoryBase.TAG_BATTERY_LEVEL:
            case ExifDirectoryBase.TAG_COPYRIGHT:
            case ExifDirectoryBase.TAG_EXPOSURE_TIME:
            case ExifDirectoryBase.TAG_FNUMBER:
            case ExifDirectoryBase.TAG_IPTC_NAA:
            case ExifDirectoryBase.TAG_INTER_COLOR_PROFILE:
            case ExifDirectoryBase.TAG_EXPOSURE_PROGRAM:
            case ExifDirectoryBase.TAG_SPECTRAL_SENSITIVITY:
            case ExifDirectoryBase.TAG_ISO_EQUIVALENT:
            case ExifDirectoryBase.TAG_OPTO_ELECTRIC_CONVERSION_FUNCTION:
            case ExifDirectoryBase.TAG_INTERLACE:
            case ExifDirectoryBase.TAG_TIME_ZONE_OFFSET_TIFF_EP:
            case ExifDirectoryBase.TAG_SELF_TIMER_MODE_TIFF_EP:
            case ExifDirectoryBase.TAG_SENSITIVITY_TYPE:
            case ExifDirectoryBase.TAG_STANDARD_OUTPUT_SENSITIVITY:
            case ExifDirectoryBase.TAG_RECOMMENDED_EXPOSURE_INDEX:
            case ExifDirectoryBase.TAG_TIME_ZONE_OFFSET:
            case ExifDirectoryBase.TAG_SELF_TIMER_MODE:
            case ExifDirectoryBase.TAG_EXIF_VERSION:
            case ExifDirectoryBase.TAG_DATETIME_ORIGINAL:
            case ExifDirectoryBase.TAG_DATETIME_DIGITIZED:
            case ExifDirectoryBase.TAG_COMPONENTS_CONFIGURATION:
            case ExifDirectoryBase.TAG_COMPRESSED_AVERAGE_BITS_PER_PIXEL:
            case ExifDirectoryBase.TAG_SHUTTER_SPEED:
            case ExifDirectoryBase.TAG_APERTURE:
            case ExifDirectoryBase.TAG_BRIGHTNESS_VALUE:
            case ExifDirectoryBase.TAG_EXPOSURE_BIAS:
            case ExifDirectoryBase.TAG_MAX_APERTURE:
            case ExifDirectoryBase.TAG_SUBJECT_DISTANCE:
            case ExifDirectoryBase.TAG_METERING_MODE:
            case ExifDirectoryBase.TAG_LIGHT_SOURCE:
            case ExifDirectoryBase.TAG_WHITE_BALANCE:
            case ExifDirectoryBase.TAG_FLASH:
            case ExifDirectoryBase.TAG_FOCAL_LENGTH:
            case ExifDirectoryBase.TAG_FLASH_ENERGY_TIFF_EP:
            case ExifDirectoryBase.TAG_SPATIAL_FREQ_RESPONSE_TIFF_EP:
            case ExifDirectoryBase.TAG_NOISE:
            case ExifDirectoryBase.TAG_FOCAL_PLANE_X_RESOLUTION_TIFF_EP:
            case ExifDirectoryBase.TAG_FOCAL_PLANE_Y_RESOLUTION_TIFF_EP:
            case ExifDirectoryBase.TAG_IMAGE_NUMBER:
            case ExifDirectoryBase.TAG_SECURITY_CLASSIFICATION:
            case ExifDirectoryBase.TAG_IMAGE_HISTORY:
            case ExifDirectoryBase.TAG_SUBJECT_LOCATION_TIFF_EP:
            case ExifDirectoryBase.TAG_EXPOSURE_INDEX_TIFF_EP:
            case ExifDirectoryBase.TAG_STANDARD_ID_TIFF_EP:
            case ExifDirectoryBase.TAG_MAKERNOTE:
            case ExifDirectoryBase.TAG_USER_COMMENT:
            case ExifDirectoryBase.TAG_SUBSECOND_TIME:
            case ExifDirectoryBase.TAG_SUBSECOND_TIME_ORIGINAL:
            case ExifDirectoryBase.TAG_SUBSECOND_TIME_DIGITIZED:
            case ExifDirectoryBase.TAG_WIN_TITLE:
            case ExifDirectoryBase.TAG_WIN_COMMENT:
            case ExifDirectoryBase.TAG_WIN_AUTHOR:
            case ExifDirectoryBase.TAG_WIN_KEYWORDS:
            case ExifDirectoryBase.TAG_WIN_SUBJECT:
            case ExifDirectoryBase.TAG_FLASHPIX_VERSION:
            case ExifDirectoryBase.TAG_COLOR_SPACE:
            case ExifDirectoryBase.TAG_EXIF_IMAGE_WIDTH:
            case ExifDirectoryBase.TAG_EXIF_IMAGE_HEIGHT:
            case ExifDirectoryBase.TAG_RELATED_SOUND_FILE:
            case ExifDirectoryBase.TAG_FLASH_ENERGY:
            case ExifDirectoryBase.TAG_SPATIAL_FREQ_RESPONSE:
            case ExifDirectoryBase.TAG_FOCAL_PLANE_X_RESOLUTION:
            case ExifDirectoryBase.TAG_FOCAL_PLANE_Y_RESOLUTION:
            case ExifDirectoryBase.TAG_FOCAL_PLANE_RESOLUTION_UNIT:
            case ExifDirectoryBase.TAG_SUBJECT_LOCATION:
            case ExifDirectoryBase.TAG_EXPOSURE_INDEX:
            case ExifDirectoryBase.TAG_SENSING_METHOD:
            case ExifDirectoryBase.TAG_FILE_SOURCE:
            case ExifDirectoryBase.TAG_SCENE_TYPE:
            case ExifDirectoryBase.TAG_CFA_PATTERN:
            case ExifDirectoryBase.TAG_CUSTOM_RENDERED:
            case ExifDirectoryBase.TAG_EXPOSURE_MODE:
            case ExifDirectoryBase.TAG_WHITE_BALANCE_MODE:
            case ExifDirectoryBase.TAG_DIGITAL_ZOOM_RATIO:
            case ExifDirectoryBase.TAG_35MM_FILM_EQUIV_FOCAL_LENGTH:
            case ExifDirectoryBase.TAG_SCENE_CAPTURE_TYPE:
            case ExifDirectoryBase.TAG_GAIN_CONTROL:
            case ExifDirectoryBase.TAG_CONTRAST:
            case ExifDirectoryBase.TAG_SATURATION:
            case ExifDirectoryBase.TAG_SHARPNESS:
            case ExifDirectoryBase.TAG_DEVICE_SETTING_DESCRIPTION:
            case ExifDirectoryBase.TAG_SUBJECT_DISTANCE_RANGE:
            case ExifDirectoryBase.TAG_IMAGE_UNIQUE_ID:
            case ExifDirectoryBase.TAG_CAMERA_OWNER_NAME:
            case ExifDirectoryBase.TAG_BODY_SERIAL_NUMBER:
            case ExifDirectoryBase.TAG_LENS_SPECIFICATION:
            case ExifDirectoryBase.TAG_LENS_MAKE:
            case ExifDirectoryBase.TAG_LENS_MODEL:
            case ExifDirectoryBase.TAG_LENS_SERIAL_NUMBER:
            case ExifDirectoryBase.TAG_GAMMA:
            case ExifDirectoryBase.TAG_PRINT_IM:
            case ExifDirectoryBase.TAG_PANASONIC_TITLE:
            case ExifDirectoryBase.TAG_PANASONIC_TITLE_2:
            case ExifDirectoryBase.TAG_PADDING:
            case ExifDirectoryBase.TAG_LENS:
            //Perform processing in the required case
            System.out.println(tag.getTagName, tag.getDescription()));
            break;
        }
    }
}

//All GPS tags
void addGPSListData(Tag tag) {
    switch (tag.getTagType()) {
        case GpsDirectory.TAG_VERSION_ID:
        case GpsDirectory.TAG_LATITUDE_REF:
        case GpsDirectory.TAG_LATITUDE:
        case GpsDirectory.TAG_LONGITUDE_REF:
        case GpsDirectory.TAG_LONGITUDE:
        case GpsDirectory.TAG_ALTITUDE_REF:
        case GpsDirectory.TAG_ALTITUDE:
        case GpsDirectory.TAG_TIME_STAMP:
        case GpsDirectory.TAG_SATELLITES:
        case GpsDirectory.TAG_STATUS:
        case GpsDirectory.TAG_MEASURE_MODE:
        case GpsDirectory.TAG_DOP:
        case GpsDirectory.TAG_SPEED_REF:
        case GpsDirectory.TAG_SPEED:
        case GpsDirectory.TAG_TRACK_REF:
        case GpsDirectory.TAG_TRACK:
        case GpsDirectory.TAG_IMG_DIRECTION_REF:
        case GpsDirectory.TAG_IMG_DIRECTION:
        case GpsDirectory.TAG_MAP_DATUM:
        case GpsDirectory.TAG_DEST_LATITUDE_REF:
        case GpsDirectory.TAG_DEST_LATITUDE:
        case GpsDirectory.TAG_DEST_LONGITUDE_REF:
        case GpsDirectory.TAG_DEST_LONGITUDE:
        case GpsDirectory.TAG_DEST_BEARING_REF:
        case GpsDirectory.TAG_DEST_BEARING:
        case GpsDirectory.TAG_DEST_DISTANCE_REF:
        case GpsDirectory.TAG_DEST_DISTANCE:
        case GpsDirectory.TAG_PROCESSING_METHOD:
        case GpsDirectory.TAG_AREA_INFORMATION:
        case GpsDirectory.TAG_DATE_STAMP:
        case GpsDirectory.TAG_DIFFERENTIAL:
            //Perform processing in the required case
            System.out.println(tag.getTagName, tag.getDescription()));
            break;
    }
}


Recommended Posts

Read JPEG Exif information ~ metadata-extractor ~
Get EXIF information in Java
Deleting Exif information using sanselan