2012-01-25 9 views
5

私はこれを試して動作させるために数多くのオプションを研究し、試しましたが、残念ながらこれでどこにも行きません。私は、AndroidのExifInterfaceを使ってTaken/DateTimeタグを設定しました

私がやっているのは、Androidアプリ内のJPEGのExifデータにDate Takenタグ(Tag_DateTime)を設定することです。私はすでにLatitudeタグとLongituteタグを設定する作業コードを持っていますが、私の人生ではDateタグを設定することはできません。ここで

は、コードは次のとおりです。

SimpleDateFormat fmt_Exif = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss"); 
try { 
    ExifInterface exif = new ExifInterface(filePhoto.getPath()); 

    // Set and save the GPS and time data 
    exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, strLat); 
    exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, strLong); 
    exif.setAttribute(ExifInterface.TAG_DATETIME, fmt_Exif.format(locLatestLocation.getTime())); 
    exif.saveAttributes(); 

} catch (IOException e) { 
    e.printStackTrace(); 
} 
  • locLatestLocation - ミリ秒単位の時間を取得するために使用されている場所。
  • fmt_Exif - TAG_DateTime Exifタグの正しいフォーマットにミリ秒の時間をフォーマットするために使用されるSimpleDateFormat。
  • strLat & strLong - 緯度と経度のタグを設定するための正しい形式の他の場所に設定されています。

私はタグをミリ秒フォーマットで書き込む必要があるので、これも無駄にしてみました。 実際に格納されているものでフォーマットを確認するために、Date Takenタグを持つjpegファイルから未フォーマットタグを読み込んで出力しましたが、出力はタグに書き込んでいるものとまったく同じフォーマットですまだ動かない。

これを行うためにSanselanクラスを検討していることに言及する価値があるかもしれません。複雑さと例がないため、完全に異なるものに変更する前に既存のソリューションを試してみてください。

誰でもこれを行うことができましたかもしそうなら、私は何が間違っていますか?

+0

解決しましたか? 「DateTime」フィールドを設定しようとすると、保存後にEXIFデータに2つのフィールドがあります。 – pbu

答えて

4

AndroidのExifInterfaceは、無効であると思われるデータを黙って捨てます。さらに悪いことに、ドキュメントには有効な値が何であるかについては言及されていません。

私は、Androidが把握できないEXIF属性(IE:ExifInterfaceのTAG_定数ではない)を指定すると、それも完全に無視され、黙って失敗することも発見しました。

2

私はあなたに同じ問題があります。 TAG_DATETIMEを使用して撮影日を保存しようとすると、元のtaken_dateが失われてしまいます。私は実際にgetDateTime()とgetGpsDateTime()の@hide関数の違いを知らない。 getGpsDateTime()は撮影日と思われます。そして、TAG_GPS_DATESTAMPとTAG_GPS_TIMESTAMPを試してみましょう。

/** 
* Returns number of milliseconds since Jan. 1, 1970, midnight UTC. 
* Returns -1 if the date time information if not available. 
* @hide 
*/ 
public long getGpsDateTime() { 
    String date = mAttributes.get(TAG_GPS_DATESTAMP); 
    String time = mAttributes.get(TAG_GPS_TIMESTAMP); 
    if (date == null || time == null) return -1; 

    String dateTimeString = date + ' ' + time; 
    if (dateTimeString == null) return -1; 

    ParsePosition pos = new ParsePosition(0); 
    try { 
     Date datetime = sFormatter.parse(dateTimeString, pos); 
     if (datetime == null) return -1; 
     return datetime.getTime(); 
    } catch (IllegalArgumentException ex) { 
     return -1; 
    } 
} 
6

今は同じことが必要でした。 私はこのEXIF article from MIT読んで、私は、書き込まれるTAG_DATETIMEを得た:このプレビューのように見えた

exif.setAttribute(ExifInterface.TAG_DATETIME,"2013:06:21 00:00:07"); 
exif.setAttribute(ExifInterface.TAG_GPS_DATESTAMP,"2013:06:21"); 
exif.setAttribute(ExifInterface.TAG_GPS_TIMESTAMP,"00:00:07"); 

exif 1

exif 2

注EXIF/TIFFで、このこと実際のオリジナルのタイムスタンプとデジタル化されたタイムスタンプではなく、GPSセクションのみです。

これは onCreateに追加して

try { 
        JpegHeaders headers = new JpegHeaders(FakeBurst.PICTURE_PATH); 
        App1Header app1Header = headers.getApp1Header(); 
        app1Header.setValue(new TagValue(Tag.IMAGEDESCRIPTION,"bla bla bla")); 
        app1Header.setValue(new TagValue(Tag.DATETIMEORIGINAL,"2013:06:21 00:00:07")); 
        app1Header.setValue(new TagValue(Tag.DATETIMEDIGITIZED,"2013:06:21 00:00:07")); 
        headers.save(true); 
        System.out.println(this+" wrote exif timestamp"); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

JpegHeaders.preheat(); 

、それが働いた:

を0

exif 3

は、私はそうJHeaderライブラリを試してみましたが、あまりにもオリジナルとデジタル化されたタイムスタンプを変更したいです

exif 4

私は多分、私は上記の投稿AndroidのExifInterfaceコードはSDKのバージョンでは動作しませんでしたが、私はJHeaderライブラリアプローチが働くだろう推測している12月からこの記事は見

exif 5

1

あなたは、彼らが

private static SimpleDateFormat sFormatter; 

    static { 
     sFormatter = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss"); 
     sFormatter.setTimeZone(TimeZone.getTimeZone("UTC")); 
    } 

ExifInterface.java

で行われ、その後、更新しているだけのように試すことができます(少なくともAPIレベル14+)私の作品

exif.setAttribute(ExifInterface.TAG_DATETIME, 
          sFormatter.format(new Date(System.currentTimeMillis()))); 
0
SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss"); 

exifInterface.setAttribute("DateTimeOriginal", dateTimeFormat.format(date)); 
exifInterface.setAttribute("DateTimeDigitized", dateTimeFormat.format(date)); 

-1

Nexus 6とLumia 935の画像にの画像がありませんCreateDateおよびDateTimeOriginalフィールド。

AndroidとWindowsの携帯電話のファイル名にもタイムスタンプを保存IMG_20160320_145825.jpg WP_20160328_13_40_42_Pro.jpg

私はこの問題を修正して、このスクリプトを実行しているフィールドを追加する成功:

#! /bin/bash 

COUNTER=0 
for filename in ./* 
do 
    case "$filename" in 
     *.JPG|*.jpeg|*.jpg) 
      COUNTER=$[$COUNTER +1] 
      y=${filename:6:4} 
      M=${filename:10:2} 
      d=${filename:12:2} 
      H=${filename:15:2} 
      m=${filename:17:2} 
      s=${filename:19:2} 
      echo "'"$y":"$M":"$d $H":"$m":"$s"'" " --> "$filename 
      exiftool -v2 -AllDates="'"$y":"$M":"$d" "$H":"$m":"$s"'" -overwrite_original $filename 
      ;; 
     *) 
      echo $filename 'Not a *.jpg' 
      ;; 
    esac 
done 

echo $COUNTER "files updated" 

Iそれが誰かを助けることを願って