diff --git a/importPicture/.classpath b/importPicture/.classpath
index 2061450..123528f 100644
--- a/importPicture/.classpath
+++ b/importPicture/.classpath
@@ -2,5 +2,6 @@
+
diff --git a/importPicture/AdjustTime.bat b/importPicture/AdjustTime.bat
deleted file mode 100644
index da79b54..0000000
--- a/importPicture/AdjustTime.bat
+++ /dev/null
@@ -1 +0,0 @@
-javaw -jar AdjustTime.jar
\ No newline at end of file
diff --git a/importPicture/AdjustTime.sh b/importPicture/AdjustTime.sh
index 845a742..61bed2a 100644
--- a/importPicture/AdjustTime.sh
+++ b/importPicture/AdjustTime.sh
@@ -1 +1 @@
-java -jar AdjustTime.jar
+java -cp .:AdjustTime.jar:commons-imaging-1.0-SNAPSHOT.jar osm.jp.gpx.matchtime.gui.AdjustTime
diff --git a/importPicture/LICENSE.txt b/importPicture/LICENSE.txt
deleted file mode 100644
index 9586edf..0000000
--- a/importPicture/LICENSE.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014 Yuu Hayashi
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-
-以下に定める条件に従い、本ソフトウェアおよび関連文書のファイル(以下「ソフトウェア」)の複製を取得するすべて
-の人に対し、ソフトウェアを無制限に扱うことを無償で許可します。これには、ソフトウェアの複製を使用、複写、変
-更、結合、掲載、頒布、サブライセンス、および/または販売する権利、およびソフトウェアを提供する相手に同じこ
-とを許可する権利も無制限に含まれます。
-
-上記の著作権表示および本許諾表示を、ソフトウェアのすべての複製または重要な部分に記載するものとします。
-
-ソフトウェアは「現状のまま」で、明示であるか暗黙であるかを問わず、何らの保証もなく提供されます。ここでいう保証
-とは、商品性、特定の目的への適合性、および権利非侵害についての保証も含みますが、それに限定されるもので
-はありません。 作者または著作権者は、契約行為、不法行為、またはそれ以外であろうと、ソフトウェアに起因または
-関連し、あるいはソフトウェアの使用またはその他の扱いによって生じる一切の請求、損害、その他の義務について何
-らの責任も負わないものとします。
diff --git a/importPicture/README.jp.txt b/importPicture/README.jp.txt
deleted file mode 100644
index c6f273e..0000000
--- a/importPicture/README.jp.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-[ importpicture ]
-
-GPSログファイル(GPX)に写真へのリンクを追加します (import picture)
-
-[概要]
-GPSログの記録時刻とデジカメの撮影時刻とを見比べて、GPSログ内に写真へのリンク情報を付加した新しいGPSログファイルを作成します。
- * 画像ファイルの更新日付をその画像の撮影日時とします。(Exi情報は無視します) ※ 対象とするファイルは'*.jpg'のみ
- * 精確な時刻との時差を入力することで、撮影日時を補正します。
- * 画像ファイルの更新日付リストをCSV形式のファイルとして出力する。
- * 結果は、取り込み元のGPXファイルとは別に、元ファイル名にアンダーバー「_」を付加した.ファイルに出力します。
-
-http://sourceforge.jp/projects/importpicture/wiki/FrontPage
-
-[起動]
-
-> java -jar importPicture.jar
-
-(パラメータ)
- argv[0] = 画像リストの出力ファイル
- argv[1] = 画像ファイルが格納されているディレクトリ
- argv[2] = 時刻補正の基準とする画像ファイル
- argv[3] = 基準画像ファイルの精確な撮影日時 "yyyy-mm-dd'T'HH:MM:ss"
- argv[4] = 撮影位置をロギングしたGPXファイル (省略可能:省略した場合は指定された画像ディレクトリ内のGPXファイルを対象とする(複数可能))
-
-exp)
-
-> java -jar importPicture.jar list.csv . IMG_01234.JPG 2012-06-15T12:52:22 鎌倉宮_2012-06-15_12-00-16.gpx
-
--------------------------------------------------------------------
-Copyright (c) 2014 Yuu Hayashi
-This software is released under the MIT License, see LICENSE.txt.
\ No newline at end of file
diff --git a/importPicture/build.xml b/importPicture/build.xml
index e6d543b..415640b 100644
--- a/importPicture/build.xml
+++ b/importPicture/build.xml
@@ -51,7 +51,7 @@
[STEP 2] コンパイル
-->
-
+
@@ -88,10 +88,11 @@
-
-
-
-
+
+
+
+
+
diff --git a/importPicture/src/AdjustTime.bat b/importPicture/src/AdjustTime.bat
new file mode 100644
index 0000000..b7c7b05
--- /dev/null
+++ b/importPicture/src/AdjustTime.bat
@@ -0,0 +1 @@
+javaw -cp .;AdjustTime.jar;commons-imaging-1.0-SNAPSHOT.jar osm.jp.gpx.matchtime.gui.AdjustTime
\ No newline at end of file
diff --git a/importPicture/src/AdjustTime.sh b/importPicture/src/AdjustTime.sh
new file mode 100644
index 0000000..61bed2a
--- /dev/null
+++ b/importPicture/src/AdjustTime.sh
@@ -0,0 +1 @@
+java -cp .:AdjustTime.jar:commons-imaging-1.0-SNAPSHOT.jar osm.jp.gpx.matchtime.gui.AdjustTime
diff --git a/importPicture/src/LICENSE.txt b/importPicture/src/LICENSE.txt
new file mode 100644
index 0000000..9586edf
--- /dev/null
+++ b/importPicture/src/LICENSE.txt
@@ -0,0 +1,35 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Yuu Hayashi
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+
+以下に定める条件に従い、本ソフトウェアおよび関連文書のファイル(以下「ソフトウェア」)の複製を取得するすべて
+の人に対し、ソフトウェアを無制限に扱うことを無償で許可します。これには、ソフトウェアの複製を使用、複写、変
+更、結合、掲載、頒布、サブライセンス、および/または販売する権利、およびソフトウェアを提供する相手に同じこ
+とを許可する権利も無制限に含まれます。
+
+上記の著作権表示および本許諾表示を、ソフトウェアのすべての複製または重要な部分に記載するものとします。
+
+ソフトウェアは「現状のまま」で、明示であるか暗黙であるかを問わず、何らの保証もなく提供されます。ここでいう保証
+とは、商品性、特定の目的への適合性、および権利非侵害についての保証も含みますが、それに限定されるもので
+はありません。 作者または著作権者は、契約行為、不法行為、またはそれ以外であろうと、ソフトウェアに起因または
+関連し、あるいはソフトウェアの使用またはその他の扱いによって生じる一切の請求、損害、その他の義務について何
+らの責任も負わないものとします。
diff --git a/importPicture/src/README.jp.txt b/importPicture/src/README.jp.txt
new file mode 100644
index 0000000..c6f273e
--- /dev/null
+++ b/importPicture/src/README.jp.txt
@@ -0,0 +1,31 @@
+[ importpicture ]
+
+GPSログファイル(GPX)に写真へのリンクを追加します (import picture)
+
+[概要]
+GPSログの記録時刻とデジカメの撮影時刻とを見比べて、GPSログ内に写真へのリンク情報を付加した新しいGPSログファイルを作成します。
+ * 画像ファイルの更新日付をその画像の撮影日時とします。(Exi情報は無視します) ※ 対象とするファイルは'*.jpg'のみ
+ * 精確な時刻との時差を入力することで、撮影日時を補正します。
+ * 画像ファイルの更新日付リストをCSV形式のファイルとして出力する。
+ * 結果は、取り込み元のGPXファイルとは別に、元ファイル名にアンダーバー「_」を付加した.ファイルに出力します。
+
+http://sourceforge.jp/projects/importpicture/wiki/FrontPage
+
+[起動]
+
+> java -jar importPicture.jar
+
+(パラメータ)
+ argv[0] = 画像リストの出力ファイル
+ argv[1] = 画像ファイルが格納されているディレクトリ
+ argv[2] = 時刻補正の基準とする画像ファイル
+ argv[3] = 基準画像ファイルの精確な撮影日時 "yyyy-mm-dd'T'HH:MM:ss"
+ argv[4] = 撮影位置をロギングしたGPXファイル (省略可能:省略した場合は指定された画像ディレクトリ内のGPXファイルを対象とする(複数可能))
+
+exp)
+
+> java -jar importPicture.jar list.csv . IMG_01234.JPG 2012-06-15T12:52:22 鎌倉宮_2012-06-15_12-00-16.gpx
+
+-------------------------------------------------------------------
+Copyright (c) 2014 Yuu Hayashi
+This software is released under the MIT License, see LICENSE.txt.
\ No newline at end of file
diff --git a/importPicture/src/osm/jp/gpx/ImportPicture.java b/importPicture/src/osm/jp/gpx/ImportPicture.java
index 6cd6145..2615639 100644
--- a/importPicture/src/osm/jp/gpx/ImportPicture.java
+++ b/importPicture/src/osm/jp/gpx/ImportPicture.java
@@ -1,11 +1,14 @@
package osm.jp.gpx;
import java.io.*;
+import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Calendar;
import java.util.Comparator;
import java.util.Date;
+import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
@@ -22,11 +25,24 @@
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
+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.common.RationalNumber;
+import org.apache.commons.imaging.formats.jpeg.JpegImageMetadata;
+import org.apache.commons.imaging.formats.jpeg.exif.ExifRewriter;
+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.GpsTagConstants;
+import org.apache.commons.imaging.formats.tiff.write.TiffOutputDirectory;
+import org.apache.commons.imaging.formats.tiff.write.TiffOutputSet;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
public class ImportPicture {
public static File gpxDir = new File(".");
+ public static File outDir = null;
/**
* ログ設定プロパティファイルのファイル内容
@@ -35,12 +51,12 @@
= "handlers=java.util.logging.ConsoleHandler\n"
+ ".level=FINEST\n"
+ "java.util.logging.ConsoleHandler.level=INFO\n"
- + "java.util.logging.ConsoleHandler.formatter=hayashi.yuu.tools.logger.YuuLogFormatter";
+ + "java.util.logging.ConsoleHandler.formatter=osm.jp.gpx.YuuLogFormatter";
/**
* static initializer によるログ設定の初期化
*/
- public static final Logger logger = Logger.getLogger("SampleLogging");
+ public static final Logger logger = Logger.getLogger("CommandLogging");
static {
InputStream inStream = null;
try {
@@ -80,11 +96,13 @@
* argv[0] = 画像ファイルが格納されているディレクトリ
* argv[1] = 時刻補正の基準とする画像ファイル
* argv[2] = 基準画像ファイルの精確な撮影日時 "yyyy-MM-dd'T'HH:mm:ss"
- * argv[3] = 撮影位置をロギングしたGPXファイル
+ * argv[3] = [EXIF] EXIF情報の書き換えを行う / [not] EXIF情報の書き換えを行わない
+ * argv[4] = 撮影位置をロギングしたGPXファイル
*
* @throws IOException
+ * @throws ImageReadException
*/
- public static void main(String[] argv) throws IOException
+ public static void main(String[] argv) throws Exception
{
Date jptime;
@@ -92,19 +110,29 @@
gpxDir = new File(argv[0]);
}
- if (argv.length < 3) {
- System.out.println("> java -jar importPicture.jar (gpx)");
- System.out.println("> java -jar importPicture.jar . IMG_01234.JPG 2012-06-15T12:52:22");
+ if (argv.length < 4) {
+ System.out.println("!!! Illigal command call. !!!");
+ System.out.println("> java -cp .:AdjustTime.jar:commons-imaging-1.0-SNAPSHOT.jar {EXIF/not} (gpx)");
+ System.out.println("> java -cp .:AdjustTime.jar:commons-imaging-1.0-SNAPSHOT.jar. IMG_01234.JPG 2012-06-15T12:52:22 EXIF");
+ System.out.println("> java -cp .:AdjustTime.jar . IMG_01234.JPG 2012-06-15T12:52:22 not");
+ System.out.println();
+ return;
}
// 基準時刻ファイルの「更新日時」を使って時刻合わせを行う。
File baseFile = new File(gpxDir, argv[1]);
jptime = new Date(baseFile.lastModified());
- // 第5引数が指定されなければ、指定されたディレクトリ内のGPXファイルすべてを対象とする
+ //
+ boolean exif = false;
+ if (argv[3].toUpperCase().equals("EXIF")) {
+ exif = true;
+ }
+
+ // 第6引数が指定されなければ、指定されたディレクトリ内のGPXファイルすべてを対象とする
ArrayList gpxFiles = new ArrayList();
- if (argv.length > 3) {
- gpxFiles.add(new File(gpxDir, argv[3]));
+ if (argv.length > 4) {
+ gpxFiles.add(new File(gpxDir, argv[4]));
}
else {
File[] files = gpxDir.listFiles();
@@ -216,11 +244,11 @@
System.out.println("GPX start time: "+ dfjp.format(new Date(gpxStartTime)) + "\t[GMT " + dfuk.format(new Date(gpxStartTime))+"]");
System.out.println(" GPX end time: "+ dfjp.format(new Date(gpxEndTime)) + "\t[GMT " + dfuk.format(new Date(gpxEndTime))+"]");
System.out.println();
- System.out.println("------------|--------------------|--------------------|------------|----------|--------");
- System.out.println(" name | UpdateTime | GPStime | LAT | LON | ele");
- System.out.println("------------|--------------------|--------------------|------------|----------|--------");
- proc(gpxDir, delta, gpxStartTime, gpxEndTime, map, gpx);
- System.out.println("------------|--------------------|--------------------|------------|----------|--------");
+ System.out.println("------------|--------------------|--------------------|------------|------------|--------");
+ System.out.println(" name | UpdateTime | GPStime | Latitude | Longitude | ele");
+ System.out.println("------------|--------------------|--------------------|------------|------------|--------");
+ proc(gpxDir, delta, gpxStartTime, gpxEndTime, map, exif, gpx);
+ System.out.println("------------|--------------------|--------------------|------------|------------|--------");
}
catch (ParseException e) {
System.out.println("'"+ timeStr +"' の書式が違います("+ TIME_FORMAT_STRING +")");
@@ -259,13 +287,20 @@
/**
* 再帰メソッド
* @throws ParseException
+ * @throws IOException
+ * @throws ImageReadException
+ * @throws ImageWriteException
*/
- static void proc(File dir, long delta, long gpxStartTime, long gpxEndTime, HashMap map, Node gpx) throws ParseException {
+ static void proc(File dir, long delta, long gpxStartTime, long gpxEndTime, HashMap map, boolean exifWrite, Node gpx) throws ParseException, ImageReadException, IOException, ImageWriteException {
+ DecimalFormat yearFormatter = new DecimalFormat("0000");
+ DecimalFormat monthFormatter = new DecimalFormat("00");
+ DecimalFormat dayFormatter = new DecimalFormat("00");
+
File[] files = dir.listFiles();
Arrays.sort(files, new FileSort());
for (File image : files) {
if (image.isDirectory()) {
- proc(image, delta, gpxStartTime, gpxEndTime, map, gpx);
+ proc(image, delta, gpxStartTime, gpxEndTime, map, exifWrite, gpx);
}
else {
String imageName = image.getName();
@@ -275,27 +310,141 @@
if ((uktime.getTime() >= gpxStartTime) && (uktime.getTime() <= gpxEndTime)) {
Element trkpt = trkpt(map, uktime);
if (trkpt != null) {
- System.out.print(String.format("%12s ", image.getName()));
+ System.out.print(String.format("%12s|", image.getName()));
System.out.print(String.format("%20s ", dfjp.format(itime)));
- System.out.print(String.format("%20s ", dfjp.format(uktime)));
+ System.out.print(String.format("%20s|", dfjp.format(uktime)));
Element wpt = createWptTag(image, uktime.getTime(), trkpt);
- System.out.print(String.format("%12s ", wpt.getAttribute("lat")));
+ String latStr = wpt.getAttribute("lat");
String lonStr = wpt.getAttribute("lon");
- //System.out.print(String.format("%12s "+ lonStr));
- System.out.print(lonStr + " ");
+ System.out.print(String.format("%12s %12s|", latStr, lonStr));
+ double latitude = Double.parseDouble(latStr);
+ double longitude = Double.parseDouble(lonStr);
+ String eleStr = null;
NodeList nodes = wpt.getChildNodes(); // 子ノードを取得
for (int i4=0; i4< nodes.getLength(); i4++) {
Node node = nodes.item(i4);
if (node != null) {
if (node.getNodeName().equals("ele")) {
- String eleStr = node.getFirstChild().getNodeValue();
- System.out.println(eleStr);
+ eleStr = node.getFirstChild().getNodeValue();
+ System.out.println(String.format("%8s|", eleStr));
+ break;
}
}
else {
System.out.println("-");
+ break;
+ }
+ }
+
+ if (exifWrite) {
+ TiffOutputSet outputSet = null;
+ FileOutputStream fos = null;
+
+ ImageMetadata meta = Imaging.getMetadata(image);
+ JpegImageMetadata jpegMetadata = (JpegImageMetadata)meta;
+ if (jpegMetadata != null) {
+ TiffImageMetadata exif = jpegMetadata.getExif();
+ if (exif != null) {
+ outputSet = exif.getOutputSet();
+ }
+ }
+
+ if (outputSet == null) {
+ System.out.println("added : new tiff output set");
+ outputSet = new TiffOutputSet();
+ }
+
+ //---- EXIF_TAG_DATE_TIME_ORIGINAL / 「撮影日時/オリジナル画像の生成日時」----
+ TiffOutputDirectory exifDir = outputSet.getOrCreateExifDirectory();
+ {
+ Calendar cal = GregorianCalendar.getInstance();
+ cal.setTime(uktime);
+ exifDir.removeField(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL);
+ exifDir.add(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL, new SimpleDateFormat("yyyy:MM:dd HH:mm:ss").format(cal.getTime()));
+ }
+
+ //---- EXIF GPS_TIME_STAMP ----
+ TiffOutputDirectory gpsDir = outputSet.getOrCreateGPSDirectory();
+ {
+ Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("UTC"));
+ cal.setTime(uktime);
+ final String yearStr = yearFormatter.format(cal.get(Calendar.YEAR));
+ final String monthStr = monthFormatter.format(cal.get(Calendar.MONTH) + 1);
+ final String dayStr = dayFormatter.format(cal.get(Calendar.DAY_OF_MONTH));
+ final String dateStamp = yearStr +":"+ monthStr +":"+ dayStr;
+
+ gpsDir.removeField(GpsTagConstants.GPS_TAG_GPS_TIME_STAMP);
+ gpsDir.add(GpsTagConstants.GPS_TAG_GPS_TIME_STAMP,
+ RationalNumber.valueOf(cal.get(Calendar.HOUR_OF_DAY)),
+ RationalNumber.valueOf(cal.get(Calendar.MINUTE)),
+ RationalNumber.valueOf(cal.get(Calendar.SECOND)));
+ gpsDir.removeField(GpsTagConstants.GPS_TAG_GPS_DATE_STAMP);
+ gpsDir.add(GpsTagConstants.GPS_TAG_GPS_DATE_STAMP, dateStamp);
+ }
+
+ //---- EXIF GPS elevation/ALTITUDE ----
+ if (eleStr != null) {
+ final double altitude = Double.parseDouble(eleStr);
+ gpsDir.removeField(GpsTagConstants.GPS_TAG_GPS_ALTITUDE);
+ gpsDir.add(GpsTagConstants.GPS_TAG_GPS_ALTITUDE, RationalNumber.valueOf(altitude));
+ }
+
+ //---- EXIF GPS_ ----
+ final String longitudeRef = (longitude < 0 ? "W" : "E");
+ longitude = Math.abs(longitude);
+ final String latitudeRef = (latitude < 0 ? "S" : "N");
+ latitude = Math.abs(latitude);
+
+ gpsDir.removeField(GpsTagConstants.GPS_TAG_GPS_LONGITUDE_REF);
+ gpsDir.add(GpsTagConstants.GPS_TAG_GPS_LONGITUDE_REF, longitudeRef);
+ gpsDir.removeField(GpsTagConstants.GPS_TAG_GPS_LATITUDE_REF);
+ gpsDir.add(GpsTagConstants.GPS_TAG_GPS_LATITUDE_REF, latitudeRef);
+ {
+ double value = longitude;
+ final double longitudeDegrees = (long) value;
+ value %= 1;
+ value *= 60.0;
+ final double longitudeMinutes = (long) value;
+ value %= 1;
+ value *= 60.0;
+ final double longitudeSeconds = value;
+ gpsDir.removeField(GpsTagConstants.GPS_TAG_GPS_LONGITUDE);
+ gpsDir.add(GpsTagConstants.GPS_TAG_GPS_LONGITUDE,
+ RationalNumber.valueOf(longitudeDegrees),
+ RationalNumber.valueOf(longitudeMinutes),
+ RationalNumber.valueOf(longitudeSeconds));
+ }
+ {
+ double value = latitude;
+ final double latitudeDegrees = (long) value;
+ value %= 1;
+ value *= 60.0;
+ final double latitudeMinutes = (long) value;
+ value %= 1;
+ value *= 60.0;
+ final double latitudeSeconds = value;
+ gpsDir.removeField(GpsTagConstants.GPS_TAG_GPS_LATITUDE);
+ gpsDir.add(GpsTagConstants.GPS_TAG_GPS_LATITUDE,
+ RationalNumber.valueOf(latitudeDegrees),
+ RationalNumber.valueOf(latitudeMinutes),
+ RationalNumber.valueOf(latitudeSeconds));
+ }
+
+ ExifRewriter rewriter = new ExifRewriter();
+ try {
+ if (outDir == null) {
+ outDir = new File(dir, "converted");
+ outDir.mkdir();
+ }
+ fos = new FileOutputStream(new File(outDir, imageName));
+ rewriter.updateExifMetadataLossy(image, fos, outputSet);
+ }
+ finally {
+ if (fos != null) {
+ fos.close();
+ }
}
}
@@ -306,9 +455,8 @@
}
}
}
-
}
-
+
static Document document;
/**
diff --git a/importPicture/src/osm/jp/gpx/YuuLogFormatter.java b/importPicture/src/osm/jp/gpx/YuuLogFormatter.java
new file mode 100644
index 0000000..09b8a0d
--- /dev/null
+++ b/importPicture/src/osm/jp/gpx/YuuLogFormatter.java
@@ -0,0 +1,47 @@
+package osm.jp.gpx;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.logging.Formatter;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+
+/**
+ * シンプルなサンプルログフォーマッタ
+ */
+public class YuuLogFormatter extends Formatter {
+ private final SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
+
+ public String format(final LogRecord argLogRecord) {
+ final StringBuffer buf = new StringBuffer();
+
+ buf.append(sdFormat.format(new Date(argLogRecord.getMillis())) +" ");
+
+ if (argLogRecord.getLevel() == Level.FINEST) {
+ buf.append("[FINEST]");
+ }
+ else if (argLogRecord.getLevel() == Level.FINER) {
+ buf.append("[FINER]");
+ }
+ else if (argLogRecord.getLevel() == Level.FINE) {
+ buf.append("[FINE]");
+ }
+ else if (argLogRecord.getLevel() == Level.CONFIG) {
+ buf.append("[CONFIG]");
+ }
+ else if (argLogRecord.getLevel() == Level.INFO) {
+ buf.append("[INFO]");
+ }
+ else if (argLogRecord.getLevel() == Level.WARNING) {
+ buf.append("[WARN]");
+ }
+ else if (argLogRecord.getLevel() == Level.SEVERE) {
+ buf.append("[SEVERE]");
+ }
+ else {
+ buf.append(Integer.toString(argLogRecord.getLevel().intValue()) +" ");
+ }
+ buf.append(" "+ /* argLogRecord.getLoggerName() +" - "+ */ argLogRecord.getMessage() +"\n");
+ return buf.toString();
+ }
+}
\ No newline at end of file
diff --git a/importPicture/src/osm/jp/gpx/matchtime/gui/AdjustTime.java b/importPicture/src/osm/jp/gpx/matchtime/gui/AdjustTime.java
index c94ac23..3783655 100644
--- a/importPicture/src/osm/jp/gpx/matchtime/gui/AdjustTime.java
+++ b/importPicture/src/osm/jp/gpx/matchtime/gui/AdjustTime.java
@@ -15,8 +15,8 @@
public class AdjustTime extends JFrame
{
public static final String PROGRAM_NAME = "AdjustTime for JOSM";
- public static final String PROGRAM_VARSION = "1.0";
- public static final String PROGRAM_UPDATE = "2014/06/30";
+ public static final String PROGRAM_VARSION = "2.0";
+ public static final String PROGRAM_UPDATE = "2015/05/30";
// Used for addNotify check.
boolean fComponentsAdjusted = false;
@@ -30,6 +30,8 @@
ParameterPanelFolder arg1Panel_1;
ParameterPanelImageFile arg1Panel_2;
ParameterPanelTime arg1Panel_3;
+ ParameterPanelSelecter arg1Panel_4; // EXIF 書き出しモード
+
JPanel buttonPanel; // ボタンパネル (下部)
JButton openButton; // [Fit]ボタン
JButton zoomInButton; // [Zoom in]ボタン
@@ -88,6 +90,9 @@
else if (object == arg1Panel_3.doButton) {
doButton_Action(event);
}
+ else if (object == arg1Panel_4.field) {
+ doButton_Action(event);
+ }
}
}
@@ -114,6 +119,10 @@
arg1Panel_3 = new ParameterPanelTime(" 基準時刻: ", ImportPicture.TIME_FORMAT_STRING);
argsPanel.add(arg1Panel_3);
+ String[] combodata = {"更新しない", "更新する"};
+ arg1Panel_4 = new ParameterPanelSelecter("EXIF変更: ", combodata);
+ argsPanel.add(arg1Panel_4);
+
this.getContentPane().add(argsPanel, BorderLayout.NORTH);
// 基準時刻画像表示
@@ -164,6 +173,7 @@
arg1Panel_2.argField.addActionListener(lSymAction);
arg1Panel_2.openButton.addActionListener(lSymAction);
arg1Panel_3.doButton.addActionListener(lSymAction);
+ arg1Panel_4.field.addActionListener(lSymAction);
//}}
}
@@ -334,11 +344,14 @@
void doButton_Action(java.awt.event.ActionEvent event) {
arg1Panel_3.doButton.setEnabled(false);
- String[] argv = new String[3];
+ String[] argv = new String[4];
//argv[0] = "list.csv";
argv[0] = arg1Panel_1.getText();
argv[1] = arg1Panel_2.getText();
argv[2] = arg1Panel_3.getText();
+ String value = (String) arg1Panel_4.field.getSelectedItem();
+ argv[3] = (value.equals("更新する") ? "EXIF" : "none");
+
(new DoDialog(this, argv)).setVisible(true);
arg1Panel_3.doButton.setEnabled(true);
diff --git a/importPicture/src/osm/jp/gpx/matchtime/gui/ParameterPanelSelecter.java b/importPicture/src/osm/jp/gpx/matchtime/gui/ParameterPanelSelecter.java
new file mode 100644
index 0000000..e8e7ad9
--- /dev/null
+++ b/importPicture/src/osm/jp/gpx/matchtime/gui/ParameterPanelSelecter.java
@@ -0,0 +1,44 @@
+package osm.jp.gpx.matchtime.gui;
+
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+
+@SuppressWarnings("serial")
+public class ParameterPanelSelecter extends JPanel implements ActionListener {
+ public static final int ITEM_WIDTH_1 = 160;
+ public static final int ITEM_WIDTH_2 = 240;
+ public static final int LINE_WIDTH = ITEM_WIDTH_1 + ITEM_WIDTH_2;
+ public static final int LINE_HEIGHT = 18;
+ public JLabel label;
+ public JComboBox field;
+ public String value;
+
+ public ParameterPanelSelecter(String title, String[] items) {
+ super(null);
+ this.value = items[0];
+
+ this.label = new JLabel(title, JLabel.RIGHT);
+ this.label.setBounds(0, 0, ITEM_WIDTH_1 - 6, LINE_HEIGHT);
+ add(this.label);
+
+ this.field = new JComboBox();
+ this.field.addActionListener(this);
+ for (int i=0; i < items.length; i++) {
+ this.field.addItem(items[i]);
+ }
+ this.field.setBounds(ITEM_WIDTH_1, 0, ITEM_WIDTH_2, LINE_HEIGHT);
+ add(this.field);
+
+ setPreferredSize(new Dimension(ITEM_WIDTH_1, LINE_HEIGHT));
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ this.value = (String)this.field.getSelectedItem();
+ }
+}
\ No newline at end of file