3 import java.io.ByteArrayInputStream;
\r
5 import java.io.FileNotFoundException;
\r
6 import java.io.IOException;
\r
7 import java.io.InputStream;
\r
8 import java.io.UnsupportedEncodingException;
\r
9 import java.nio.file.Files;
\r
10 import java.nio.file.Path;
\r
11 import java.nio.file.Paths;
\r
12 import java.text.DateFormat;
\r
13 import java.text.ParseException;
\r
14 import java.text.SimpleDateFormat;
\r
15 import java.util.Date;
\r
16 import java.util.ResourceBundle;
\r
17 import java.util.TimeZone;
\r
18 import java.util.logging.LogManager;
\r
19 import java.util.logging.Logger;
\r
21 import javax.xml.parsers.*;
\r
22 import javax.xml.transform.TransformerException;
\r
24 import org.apache.commons.imaging.ImageReadException;
\r
25 import org.apache.commons.imaging.ImageWriteException;
\r
26 import org.xml.sax.SAXException;
\r
28 public class ImportPicture extends Thread {
\r
31 * 実行中に発生したExceptionを保持する場所
\r
33 public Exception ex = null;
\r
36 * ログ設定プロパティファイルのファイル内容
\r
38 protected static final String LOGGING_PROPERTIES_DATA
\r
39 = "handlers=java.util.logging.ConsoleHandler\n"
\r
41 + "java.util.logging.ConsoleHandler.level=INFO\n"
\r
42 + "java.util.logging.ConsoleHandler.formatter=osm.jp.gpx.YuuLogFormatter";
\r
45 * static initializer によるログ設定の初期化
\r
47 public static final Logger LOGGER = Logger.getLogger("CommandLogging");
\r
49 try (InputStream inStream = new ByteArrayInputStream(LOGGING_PROPERTIES_DATA.getBytes("UTF-8"))) {
\r
51 LogManager.getLogManager().readConfiguration(inStream);
\r
52 // "ログ設定: LogManagerを設定しました。"
\r
53 LOGGER.config("LoggerSettings: LogManager setuped.");
\r
55 catch (IOException e) {
\r
56 // LogManager設定の際に例外が発生しました.
\r
57 String str = "LoggerSettings: Exception occered:" + e.toString();
\r
58 LOGGER.warning(str);
\r
61 catch (UnsupportedEncodingException e) {
\r
62 String str = "LoggerSettings: Not supported 'UTF-8' encoding: " + e.toString();
\r
64 } catch (IOException e1) {
\r
65 LOGGER.severe(e1.toString());
\r
70 * 画像ファイルをGPXファイルに取り込みます。
\r
72 * ・画像ファイルの更新日付をその画像の撮影日時とします。(Exi情報は無視します)
\r
73 * ※ 対象とするファイルは'*.jpg'のみ
\r
74 * ・精確な時刻との時差を入力することで、撮影日時を補正します。
\r
75 * ・画像ファイルの更新日付リストをCSV形式のファイルとして出力する。
\r
76 * ・・結果は、取り込み元のGPXファイルとは別に、元ファイル名にアンダーバー「_」を付加した.ファイルに出力します。
\r
78 * exp) $ java -cp .:AdjustTime.jar:commons-imaging-1.0-SNAPSHOT.jar [AdjustTime.ini]
\r
81 * argv[0] = INIファイルのパス名
\r
83 * @throws IOException
\r
84 * @throws ImageReadException
\r
86 public static void main(String[] argv) throws Exception
\r
88 ImportPicture obj = new ImportPicture();
\r
89 obj.setUp(((argv.length < 1) ? AppParameters.FILE_PATH : argv[0]));
\r
92 //public File gpxDir;
\r
93 public ImgFolder imgFolder;
\r
94 public GpxFolder gpxFolder;
\r
95 public AppParameters params;
\r
97 private static final String EXIF_DATE_TIME_FORMAT_STRING = "yyyy:MM:dd HH:mm:ss";
\r
98 public static final ResourceBundle i18n = ResourceBundle.getBundle("i18n");
\r
100 public void setUp(String paramFilePath) throws Exception {
\r
101 System.out.println("Param File = '"+ paramFilePath +"'");
\r
102 this.params = new AppParameters(paramFilePath);
\r
107 // AppParameters.IMG_SOURCE_FOLDER に置き換え
\r
108 imgFolder = new ImgFolder(params);
\r
109 gpxFolder = new GpxFolder(params);
\r
112 // AppParameters.IMG_OUTPUT に置き換え
\r
113 if (params.isImgOutput()) {
\r
114 Path outDir = Paths.get(params.getProperty(AppParameters.IMG_OUTPUT_FOLDER));
\r
115 if (!Files.exists(outDir)) {
\r
116 // 出力ディレクトリが存在しないときは作成する
\r
117 Files.createDirectories(outDir);
\r
119 else if (!Files.isDirectory(outDir)) {
\r
120 // 出力ディレクトリがFILEのときはERROR
\r
121 throw new FileNotFoundException(String.format("OUTPUT directory '%s' is a File!", outDir.toAbsolutePath().toString()));
\r
123 outDir = Paths.get(outDir.toAbsolutePath().toString(), imgFolder.getImgDir().getFileName().toString());
\r
124 //File f = new File(outDir.toFile(), imgFolder.getImgDir().toFile().getName());
\r
125 //outDir = f.toPath();
\r
126 imgFolder.setOutDir(outDir);
\r
132 } catch(InterruptedException end) {}
\r
133 if (this.ex != null) {
\r
140 <wpt lat="35.25714922" lon="139.15490497">
\r
141 <ele>62.099998474121094</ele>
\r
142 <time>2012-06-11T00:44:38Z</time>
\r
144 <name><![CDATA[写真]]></name>
\r
145 <cmt><![CDATA[精度: 3.0m]]></cmt>
\r
146 <link href="2012-06-11_09-44-38.jpg">
\r
147 <text>2012-06-11_09-44-38.jpg</text>
\r
154 public void run() {
\r
157 String timeStr = params.getProperty(AppParameters.IMG_TIME);
\r
159 Date t = ImportPicture.toUTCDate(timeStr);
\r
161 // 基準時刻ファイルの「更新日時」を使って時刻合わせを行う。
\r
162 // argv[1] --> AppParameters.IMG_BASE_FILE に置き換え
\r
163 Date imgtime = ImgFile.getDate(params, getImgBaseFile());
\r
164 delta = t.getTime() - imgtime.getTime();
\r
166 catch (ParseException e) {
\r
167 // "'%s'の書式が違います(%s)"0
\r
168 System.out.println(
\r
170 ImportPicture.i18n.getString("msg.130"),
\r
172 ImportPicture.TIME_FORMAT_STRING
\r
178 for (GpxFile gpxFile : gpxFolder) {
\r
181 System.out.println("time difference: "+ (delta / 1000) +"(sec)");
\r
182 System.out.println(" Target GPX: ["+ gpxFile.getAbsolutePath() +"]");
\r
183 System.out.println(" EXIF: "+ (params.isImgOutputExif() ? ("convert to '" + imgFolder.getOutDir().toAbsolutePath() +"'") : "off"));
\r
184 System.out.println();
\r
186 gpxFile.printinfo();
\r
187 imgFolder.procGPXfile(gpxFile, delta);
\r
190 // imgDir内の画像ファイルを処理する
\r
191 ImgFile.printheader();
\r
192 for (ImgFile image : imgFolder) {
\r
195 ImgFile.printfooter();
\r
197 catch(ParserConfigurationException | SAXException | IOException | ParseException | ImageReadException | ImageWriteException | IllegalArgumentException | TransformerException e) {
\r
198 e.printStackTrace();
\r
199 this.ex = new Exception(e);
\r
208 public static final String TIME_FORMAT_STRING = "yyyy-MM-dd'T'HH:mm:ss'Z'";
\r
210 public static Date toUTCDate(String timeStr) throws ParseException {
\r
211 DateFormat dfUTC = new SimpleDateFormat(TIME_FORMAT_STRING);
\r
212 dfUTC.setTimeZone(TimeZone.getTimeZone("UTC"));
\r
213 return dfUTC.parse(timeStr);
\r
216 public static String toUTCString(Date localdate) {
\r
217 DateFormat dfUTC = new SimpleDateFormat(TIME_FORMAT_STRING);
\r
218 dfUTC.setTimeZone(TimeZone.getTimeZone("UTC"));
\r
219 return dfUTC.format(localdate);
\r
223 * DateをEXIFの文字列に変換する。
\r
224 * 注意:EXiFの撮影時刻はUTC時間ではない
\r
228 public static String toEXIFString(Date localdate) {
\r
229 DateFormat dfUTC = new SimpleDateFormat(EXIF_DATE_TIME_FORMAT_STRING);
\r
230 return dfUTC.format(localdate);
\r
234 * EXIFの文字列をDateに変換する。
\r
235 * 注意:EXiFの撮影時刻はUTC時間ではない
\r
238 * @throws ParseException
\r
240 public static Date toEXIFDate(String timeStr) throws ParseException {
\r
241 DateFormat dfUTC = new SimpleDateFormat(EXIF_DATE_TIME_FORMAT_STRING);
\r
242 //dfUTC.setTimeZone(TimeZone.getTimeZone("UTC"));
\r
243 return dfUTC.parse(timeStr);
\r
246 public File getImgBaseFile() {
\r
247 return new File(imgFolder.getImgDir().toFile(), params.getProperty(AppParameters.IMG_BASE_FILE));
\r
250 static String getShortPathName(File dir, File iFile) {
\r
251 String dirPath = dir.getAbsolutePath();
\r
252 String filePath = iFile.getAbsolutePath();
\r
253 if (filePath.startsWith(dirPath)) {
\r
254 return filePath.substring(dirPath.length()+1);
\r