【问题标题】:How to edit date_time_original exif tag using Apache in java?如何在 java 中使用 Apache 编辑 date_time_original exif 标签?
【发布时间】:2016-10-17 19:18:50
【问题描述】:
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;

import org.apache.sanselan.*;
import org.apache.sanselan.ImageReadException;
import org.apache.sanselan.ImageWriteException;
import org.apache.sanselan.common.IImageMetadata;
import org.apache.sanselan.common.ImageMetadata;
import org.apache.sanselan.common.RationalNumber;
import org.apache.sanselan.formats.jpeg.JpegImageMetadata;
import org.apache.sanselan.formats.jpeg.exifRewrite.ExifRewriter;
import org.apache.sanselan.formats.tiff.TiffImageMetadata;
import org.apache.sanselan.formats.tiff.constants.ExifTagConstants;
import org.apache.sanselan.formats.tiff.constants.TiffConstants;
import org.apache.sanselan.formats.tiff.constants.TiffFieldTypeConstants;
import org.apache.sanselan.formats.tiff.constants.TiffTagConstants;
import org.apache.sanselan.formats.tiff.write.TiffOutputDirectory;
import org.apache.sanselan.formats.tiff.write.TiffOutputField;
import org.apache.sanselan.formats.tiff.write.TiffOutputSet;
import org.apache.sanselan.formats.tiff.fieldtypes.FieldType;
import org.apache.sanselan.formats.tiff.fieldtypes.FieldTypeASCII;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;


public class extraction {

public static void main(String[] args) throws ImageReadException, ImageWriteException, IOException {
    extraction obj = new extraction();
    File jpeg = new File("/Users/prijunankar/Desktop/G0015444.jpg");
    File jpeg2 = new File("/Users/prijunankar/Desktop/G0015444a.jpg");

    obj.editAnnotation(jpeg, jpeg2, "2016:07:04 00:00:00");

}



public void editAnnotation(final File jpeg, final File dest, final String tag) throws ImageReadException, IOException, ImageWriteException {
        OutputStream os = null;
        TiffOutputSet outputSet = null;
        final IImageMetadata md = Sanselan.getMetadata(jpeg);
        final JpegImageMetadata jpegmd = (JpegImageMetadata) md;
        TiffOutputDirectory exifDir = null;

        if(null != jpegmd) {
                final TiffImageMetadata exif = jpegmd.getExif();

                if (null != exif) {
                    outputSet = exif.getOutputSet();
                    exifDir = outputSet.getExifDirectory();
                    //System.out.println(exifDir.getFields().toString());
                    System.out.println("exif exists");
                }
                }
        else if (null == outputSet) {
                outputSet = new TiffOutputSet();
                System.out.println("no exif");
                exifDir = outputSet.getOrCreateExifDirectory();
        }   
        //final FieldType field = new FieldType(TiffFieldTypeConstants.FIELD_TYPE_ASCII, 1, "Test");

        Date newDate = new Date();
        newDate.setDate(1);
        newDate.setMonth(2);
        newDate.setYear(2016);
        String date = newDate.toString();
        byte[] b = date.getBytes();
        final TiffOutputField output = new TiffOutputField(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL, FieldType.FIELD_TYPE_BYTE, b.length, b);
        //final TiffOutputField output2 = TiffOutputField.
        //final TiffOutputDirectory exifDir = outputSet.getExifDirectory();
        //System.out.println(exifDir.toString());
        //System.out.println(exifDir.getRawTiffImageData().toString());

        exifDir.removeField(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL);
        exifDir.add(output);

        double longitude = -74.0; // 74 degrees W (in Degrees East)
        double latitude = 40 + 43 / 60.0; // 40 degrees N (in Degrees
        // North)

        outputSet.setGPSInDegrees(longitude, latitude);


        os = new FileOutputStream(dest);
        os = new BufferedOutputStream(os);

        new ExifRewriter().updateExifMetadataLossless(jpeg, os, outputSet);

        os.close();
        os = null;
}

}

这是我用来尝试更新 Original_Date_Time 标记的代码。但是,在运行此代码后检查新的 exif 数据时,它会输出:

file: \Users\prijunankar\Desktop\G0015444a.jpg
XResolution: 72
Date Time: '2016:07:03 17:46:24'
Date Time Original: 87, 101, 100, 32, 77, 97, 114, 32, 48, 49, 32, 49, 52, 58, 50, 53, 58, 48, 52, 32, 69, 83, 84, 32, 51, 57, 49, 54
ISO: 100
Shutter Speed Value: -11468/-1000 (11.468)
Aperture Value: 280/100 (2.8)
Brightness Value: Not Found.

日期时间原始标签不保存为字符串(以前是相同格式的日期时间),而是保存为字节数组。有人可以帮忙解释为什么/出了什么问题吗?

【问题讨论】:

  • 您使用的是FIELD_TYPE_BYTE,但应使用FIELD_TYPE_ASCII 来表示日期。此外,您正在编写与 TIFF 日期中使用的格式不匹配的 Date.toString()(即“Wed Mar 01 14:25:04 EST 3916”)的输出。 tag 参数的值可以,但是好像没有用。

标签: java apache metadata tiff imaging


【解决方案1】:

这是我编写的一些代码,大量借鉴了各种示例:

package com.sengsational.jdf;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.apache.commons.imaging.ImageReadException;
import org.apache.commons.imaging.ImageWriteException;
import org.apache.commons.imaging.Imaging;
import org.apache.commons.imaging.common.ImageMetadata;
import org.apache.commons.imaging.formats.jpeg.JpegImageMetadata;
import org.apache.commons.imaging.formats.jpeg.exif.ExifRewriter;
import org.apache.commons.imaging.formats.tiff.TiffField;
import org.apache.commons.imaging.formats.tiff.TiffImageMetadata;
import org.apache.commons.imaging.formats.tiff.constants.ExifTagConstants;
import org.apache.commons.imaging.formats.tiff.constants.TiffTagConstants;
import org.apache.commons.imaging.formats.tiff.fieldtypes.FieldType;
import org.apache.commons.imaging.formats.tiff.taginfos.TagInfo;
import org.apache.commons.imaging.formats.tiff.write.TiffOutputDirectory;
import org.apache.commons.imaging.formats.tiff.write.TiffOutputField;
import org.apache.commons.imaging.formats.tiff.write.TiffOutputSet;

/*
 * Created on Aug 26, 2021
 *
 */

public class JpgDateFixer {
    public static final int DATE_TIME_ORIGINAL = 0x9003;
    
    public static void updateHourOnFile(String inputFileName, String outputFileName, int hourChange) throws ImageReadException, IOException, ParseException, ImageWriteException {
        File inputFile = new File(inputFileName);
        final ImageMetadata metadata = Imaging.getMetadata(inputFile);

        if (metadata!=null && metadata instanceof JpegImageMetadata) {
            final JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata;
            System.out.println("we have metadata");
            final TiffField dateTimeField = jpegMetadata.findEXIFValueWithExactMatch(TiffTagConstants.TIFF_TAG_DATE_TIME);
            SimpleDateFormat SDF = new SimpleDateFormat("yyyy:MM:dd kk:mm:ss");
            Date pictureDate = SDF.parse((String)dateTimeField.getValue());
            System.out.println("date: " + pictureDate);
            Calendar cal = Calendar.getInstance();
            cal.clear();
            cal.setTime(pictureDate);
            cal.add(Calendar.HOUR, hourChange);
            System.out.println("new date time: " + cal.getTime());
           
            TiffOutputSet outputSet = null;
            try (FileOutputStream fos = new FileOutputStream(new File(outputFileName)); OutputStream os = new BufferedOutputStream(fos)) {
                final TiffImageMetadata exif = jpegMetadata.getExif();
                outputSet = exif.getOutputSet();
                if (outputSet != null) {
                    final TiffOutputDirectory exifDirectory = outputSet.getOrCreateExifDirectory();
                    FieldType originalFieldType = null;
                    TagInfo originalTagInfo = null;
                    TiffOutputField dateTimeFieldOriginal = exifDirectory.findField(DATE_TIME_ORIGINAL); // DateTimeOriginal
                    if (dateTimeFieldOriginal != null) {
                        originalFieldType = dateTimeFieldOriginal.fieldType;
                        originalTagInfo = dateTimeFieldOriginal.tagInfo;
                    }
                    
                    exifDirectory.removeField(DATE_TIME_ORIGINAL);
                    String updatedDateString = SDF.format(cal.getTime());
                    final TiffOutputField dateTimeOutputField = new TiffOutputField(originalTagInfo, originalFieldType, updatedDateString.length(), updatedDateString.getBytes());
                    exifDirectory.add(dateTimeOutputField);
                    new ExifRewriter().updateExifMetadataLossless(inputFile, os, outputSet);
                } else {
                    System.out.println("no cigar on output set from file " + inputFileName);
                }
            }
        } else {
            System.out.println("no cigar on file " + inputFileName);
        }
        
    }

    public static void main(String[] args) throws ImageWriteException, ImageReadException, IOException, ParseException {
        String inputFileName = "C:\\Users\\Owner\\Pictures\\2021\\08 10 Florida and Puerto Rico\\LumixCamera\\P1000032.JPG";
        String outputFileName = "C:\\Users\\Owner\\Pictures\\2021\\08 10 Florida and Puerto Rico\\LumixCamera\\P1000032_.JPG";
        int hoursChange = -6;
        updateHourOnFile(inputFileName, outputFileName, hoursChange);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多