OSDN Git Service

fixed : compile warrnings.
[importpicture/importpicture.git] / src / main / java / osm / jp / gpx / Restamp.java
1 package osm.jp.gpx;\r
2 \r
3 import java.io.*;\r
4 import java.text.DateFormat;\r
5 import java.text.SimpleDateFormat;\r
6 import java.util.ArrayList;\r
7 import java.util.Calendar;\r
8 import java.util.Comparator;\r
9 import java.util.Date;\r
10 import java.util.ResourceBundle;\r
11 import java.util.logging.LogManager;\r
12 import java.util.logging.Logger;\r
13 import org.apache.commons.imaging.ImageReadException;\r
14 \r
15 /**\r
16  * 動画から一定間隔で切り出したIMAGEファイルの更新日時を書き換える\r
17  * \r
18  * @author yuu\r
19  */\r
20 public class Restamp extends Thread {\r
21     static public final String TIME_PATTERN = "yyyy-MM-dd HH:mm:ss z";\r
22 \r
23     /**\r
24      * 実行中に発生したExceptionを保持する場所\r
25      */\r
26     public Exception ex = null;\r
27         \r
28     /**\r
29      * ログ設定プロパティファイルのファイル内容\r
30      */\r
31     protected static final String LOGGING_PROPERTIES_DATA\r
32            = "handlers=java.util.logging.ConsoleHandler\n"\r
33            + ".level=FINEST\n"\r
34            + "java.util.logging.ConsoleHandler.level=INFO\n"\r
35            + "java.util.logging.ConsoleHandler.formatter=osm.jp.gpx.YuuLogFormatter";\r
36 \r
37     /**\r
38      * static initializer によるログ設定の初期化\r
39      */\r
40     public static final Logger LOGGER = Logger.getLogger("CommandLogging");\r
41     static {\r
42         InputStream inStream = null;\r
43         try {\r
44             inStream = new ByteArrayInputStream(LOGGING_PROPERTIES_DATA.getBytes("UTF-8"));\r
45             try {\r
46                 LogManager.getLogManager().readConfiguration(inStream);\r
47                 // "ログ設定: LogManagerを設定しました。"\r
48                 LOGGER.config("LoggerSettings: LogManager setuped.");\r
49             }\r
50             catch (IOException e) {\r
51                 // LogManager設定の際に例外が発生しました.\r
52                 String str = "LoggerSettings: Exception occered:" + e.toString();\r
53                 LOGGER.warning(str);\r
54             }\r
55         }\r
56         catch (UnsupportedEncodingException e) {\r
57             String str = "LoggerSettings: Not supported 'UTF-8' encoding: " + e.toString();\r
58             LOGGER.severe(str);\r
59         }\r
60         finally {\r
61             try {\r
62                 if (inStream != null) {\r
63                     inStream.close();\r
64                 }\r
65             } catch (IOException e) {\r
66                 String str = "LoggerSettings: Exception occored: "+ e.toString();\r
67                 LOGGER.warning(str);\r
68             }\r
69         }\r
70     }\r
71 \r
72     /**\r
73      * メイン\r
74      * 動画から一定間隔で切り出したIMAGEのファイル更新日時を書き換える\r
75      * \r
76      * ・画像ファイルの更新日付を書き換えます。(Exi情報は無視します)\r
77      *    ※ 指定されたディレクトリ内のすべての'*.jpg'ファイルを処理の対象とします\r
78      * ・画像は連番形式(名前順に並べられること)の名称となっていること\r
79      * \r
80      * パラメータ\r
81      * ・対象のフォルダ(ディレクトリ内のすべての'*.jpg'ファイルを処理の対象とします)\r
82      * ・基準となる画像\r
83      * ・基準画像の正しい日時\r
84      * ・画像ファイルの間隔(秒)\r
85      * \r
86      *  exp) $ java -cp .:AdjustTime.jar:commons-imaging-1.0-SNAPSHOT.jar [AdjustTime.ini]\r
87      * \r
88      * 1. 予め、動画から画像を切り出す\r
89      *   ソースファイル(mp4ファイル); 「-i 20160427_104154.mp4」\r
90      *     出力先: 「-f image2 img/%06d.jpg」 imgフォルダに6桁の連番ファイルを差出力する\r
91      *   切り出し開始秒数→ 「-ss 0」 (ファイルの0秒から切り出し開始)\r
92      *   切り出し間隔; 「-r 30」 (1秒間隔=30fps間隔)\r
93      * ```\r
94      * $ cd /home/yuu/Desktop/OSM/20180325_横浜新道\r
95      * $ ffmpeg -ss 0  -i 20160427_104154.mp4 -f image2 -r 15 img/%06d.jpg\r
96      * ```\r
97      * \r
98      * 2. ファイルの更新日付を書き換える\r
99      * ```\r
100      * $ cd /home/yuu/Desktop/workspace/AdjustTime/importPicture/dist\r
101      * $ java -cp .:AdjustTime2.jar osm.jp.gpx.Restamp /home/yuu/Desktop/OSM/20180325_横浜新道/img 000033.jpg 2018-03-25_12:20:32 003600.jpg  2018-03-25_13:20:09\r
102      * ```\r
103      * \r
104      * @param argv\r
105      * argv[0] = 画像ファイルが格納されているディレクトリ   imgDir\r
106      * argv[1] = 時刻補正の基準とする画像ファイル                       baseFile\r
107      * argv[2] = 基準画像ファイルの精確な撮影日時 "yyyy-MM-dd HH:mm:ss z" baseTime\r
108      * argv[3] = 時刻補正の基準とする画像ファイル                        baseFile\r
109      * argv[4] = 基準画像ファイルの精確な撮影日時 "yyyy-MM-dd HH:mm:ss z" baseTime\r
110      * \r
111      * @throws IOException\r
112      * @throws ImageReadException \r
113      */\r
114     public static void main(String[] argv) throws Exception\r
115     {\r
116         if (argv.length < 5) {\r
117             System.out.println("java Restamp <imgDir> <baseFile1> <timeStr1> <baseFile2> <timeStr2>");\r
118             return;\r
119         }\r
120         \r
121         File imgDir = new File(argv[0]);\r
122         if (!imgDir.exists()) {\r
123             // "[error] <imgDir>が存在しません。"\r
124             System.out.println(i18n.getString("msg.200"));\r
125             return;\r
126         }\r
127         if (!imgDir.isDirectory()) {\r
128             // "[error] <imgDir>がフォルダじゃない"\r
129             System.out.println(i18n.getString("msg.210"));\r
130             return;\r
131         }\r
132         \r
133         File baseFile1 = new File(imgDir, argv[1]);\r
134         if (!baseFile1.exists()) {\r
135             // "[error] <baseFile1>が存在しません。"\r
136             System.out.println(i18n.getString("msg.220"));\r
137             return;\r
138         }\r
139         if (!baseFile1.isFile()) {\r
140             // "[error] <baseFile1>がファイルじゃない"\r
141             System.out.println(i18n.getString("msg.230"));\r
142             return;\r
143         }\r
144         \r
145         DateFormat df1 = new SimpleDateFormat(TIME_PATTERN);\r
146         Date baseTime1 = df1.parse(argv[2]);\r
147 \r
148         File baseFile2 = new File(imgDir, argv[3]);\r
149         if (!baseFile2.exists()) {\r
150             // "[error] <baseFile2>が存在しません。"\r
151             System.out.println(i18n.getString("msg.240"));\r
152             return;\r
153         }\r
154         if (!baseFile2.isFile()) {\r
155             // "[error] <baseFile2>がファイルじゃない"\r
156             System.out.println(i18n.getString("msg.250"));\r
157             return;\r
158         }\r
159         \r
160         Date baseTime2 = df1.parse(argv[4]);\r
161 \r
162         Restamp obj = new Restamp();\r
163         obj.setUp(imgDir, baseFile1, baseTime1, baseFile2, baseTime2);\r
164     }\r
165     \r
166     public File imgDir;\r
167     public Date baseTime1;\r
168     public Date baseTime2;\r
169     public int bCount1 = 0;\r
170     public int bCount2 = 0;\r
171     public long span = 0;\r
172     public ArrayList<File> jpgFiles = new ArrayList<>();\r
173     public static ResourceBundle i18n = ResourceBundle.getBundle("i18n");\r
174         \r
175     public void setUp(File imgDir, File baseFile1, Date baseTime1,  File baseFile2, Date baseTime2) throws Exception {\r
176         // 指定されたディレクトリ内のGPXファイルすべてを対象とする\r
177         File[] files = imgDir.listFiles();\r
178         java.util.Arrays.sort(files, new java.util.Comparator<File>() {\r
179             @Override\r
180             public int compare(File file1, File file2){\r
181                 return file1.getName().compareTo(file2.getName());\r
182             }\r
183         });\r
184         bCount1 = 0;\r
185         bCount2 = 0;\r
186         boolean base1 = false;\r
187         boolean base2 = false;\r
188         for (File file : files) {\r
189             if (file.isFile()) {\r
190                 String filename = file.getName().toUpperCase();\r
191                 if (filename.toUpperCase().endsWith(".JPG")) {\r
192                     this.jpgFiles.add(file);\r
193                     bCount1 += (base1 ? 0 : 1);\r
194                     bCount2 += (base2 ? 0 : 1);\r
195                     if (file.getName().equals(baseFile1.getName())) {\r
196                         base1 = true;\r
197                     }\r
198                     if (file.getName().equals(baseFile2.getName())) {\r
199                         base2 = true;\r
200                     }\r
201                 }\r
202             }\r
203         }\r
204 \r
205         try {\r
206             DateFormat df2 = new SimpleDateFormat(TIME_PATTERN);\r
207             \r
208             // imgDir内の画像ファイルを処理する\r
209             long span = baseTime2.getTime() - baseTime1.getTime();\r
210             span = span / (bCount2 - bCount1);\r
211             int i = 0;\r
212             System.out.println("-------------------------------");\r
213             System.out.println("Update last modified date time.");\r
214             for (File jpgFile : this.jpgFiles) {\r
215                 long deltaMsec = (i - (bCount1 -1)) * span;\r
216                 i++;\r
217                 Calendar cal = Calendar.getInstance();\r
218                 cal.setTime(baseTime1);\r
219                 cal.add(Calendar.MILLISECOND, (int) deltaMsec);\r
220                 \r
221                 System.out.println(String.format("\t%s --> %s", df2.format(cal.getTime()), jpgFile.getName()));\r
222                 jpgFile.setLastModified(cal.getTimeInMillis());\r
223             }\r
224             System.out.println("-------------------------------");\r
225         }\r
226         catch(Exception e) {\r
227             this.ex = new Exception(e);\r
228         }\r
229     }\r
230     \r
231     /**\r
232      * 対象は '*.JPG' のみ対象とする\r
233      * @return \r
234      * @param name\r
235      */\r
236     public static boolean checkFile(String name) {\r
237         return ((name != null) && name.toUpperCase().endsWith(".JPG"));\r
238     }\r
239 \r
240     /**\r
241      * ファイル名の順序に並び替えるためのソートクラス\r
242      * \r
243      * @author hayashi\r
244      */\r
245     static class FileSort implements Comparator<File> {\r
246         @Override\r
247         public int compare(File src, File target){\r
248             int diff = src.getName().compareTo(target.getName());\r
249             return diff;\r
250         }\r
251     }\r
252 \r
253     /**\r
254      * JPEGファイルフィルター\r
255      * @author yuu\r
256      */\r
257     class JpegFileFilter implements FilenameFilter {\r
258         @Override\r
259         public boolean accept(File dir, String name) {\r
260             return name.toUpperCase().matches(".*\\.JPG$");\r
261         }\r
262     }\r
263 }