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
16 * 動画から一定間隔で切り出したIMAGEファイルの更新日時を書き換える
\r
20 public class Restamp extends Thread {
\r
21 static public final String TIME_PATTERN = "yyyy-MM-dd HH:mm:ss z";
\r
24 * 実行中に発生したExceptionを保持する場所
\r
26 public Exception ex = null;
\r
29 * ログ設定プロパティファイルのファイル内容
\r
31 protected static final String LOGGING_PROPERTIES_DATA
\r
32 = "handlers=java.util.logging.ConsoleHandler\n"
\r
34 + "java.util.logging.ConsoleHandler.level=INFO\n"
\r
35 + "java.util.logging.ConsoleHandler.formatter=osm.jp.gpx.YuuLogFormatter";
\r
38 * static initializer によるログ設定の初期化
\r
40 public static final Logger LOGGER = Logger.getLogger("CommandLogging");
\r
42 InputStream inStream = null;
\r
44 inStream = new ByteArrayInputStream(LOGGING_PROPERTIES_DATA.getBytes("UTF-8"));
\r
46 LogManager.getLogManager().readConfiguration(inStream);
\r
47 // "ログ設定: LogManagerを設定しました。"
\r
48 LOGGER.config("LoggerSettings: LogManager setuped.");
\r
50 catch (IOException e) {
\r
51 // LogManager設定の際に例外が発生しました.
\r
52 String str = "LoggerSettings: Exception occered:" + e.toString();
\r
53 LOGGER.warning(str);
\r
56 catch (UnsupportedEncodingException e) {
\r
57 String str = "LoggerSettings: Not supported 'UTF-8' encoding: " + e.toString();
\r
62 if (inStream != null) {
\r
65 } catch (IOException e) {
\r
66 String str = "LoggerSettings: Exception occored: "+ e.toString();
\r
67 LOGGER.warning(str);
\r
74 * 動画から一定間隔で切り出したIMAGEのファイル更新日時を書き換える
\r
76 * ・画像ファイルの更新日付を書き換えます。(Exi情報は無視します)
\r
77 * ※ 指定されたディレクトリ内のすべての'*.jpg'ファイルを処理の対象とします
\r
78 * ・画像は連番形式(名前順に並べられること)の名称となっていること
\r
81 * ・対象のフォルダ(ディレクトリ内のすべての'*.jpg'ファイルを処理の対象とします)
\r
86 * exp) $ java -cp .:AdjustTime.jar:commons-imaging-1.0-SNAPSHOT.jar [AdjustTime.ini]
\r
87 * exp) > java -cp .;AdjustTime.jar;commons-imaging-1.0-SNAPSHOT.jar [AdjustTime.ini]
\r
90 * ソースファイル(mp4ファイル); 「-i 20160427_104154.mp4」
\r
91 * 出力先: 「-f image2 img/%06d.jpg」 imgフォルダに6桁の連番ファイルを差出力する
\r
92 * 切り出し開始秒数→ 「-ss 0」 (ファイルの0秒から切り出し開始)
\r
93 * 切り出し間隔; 「-r 30」 (1秒間隔=30fps間隔)
\r
95 * $ cd /home/yuu/Desktop/OSM/20180325_横浜新道
\r
96 * $ ffmpeg -ss 0 -i 20160427_104154.mp4 -f image2 -r 15 img/%06d.jpg
\r
99 * 2. ファイルの更新日付を書き換える
\r
101 * $ cd /home/yuu/Desktop/workspace/AdjustTime/importPicture/dist
\r
102 * $ 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
106 * argv[0] = 画像ファイルが格納されているディレクトリ --> imgDir
\r
107 * argv[1] = 時刻補正の基準とする画像ファイル --> baseFile
\r
108 * argv[2] = 基準画像ファイルの精確な撮影日時 "yyyy-MM-dd HH:mm:ss z" --> baseTime
\r
109 * argv[3] = 時刻補正の基準とする画像ファイル --> baseFile
\r
110 * argv[4] = 基準画像ファイルの精確な撮影日時 "yyyy-MM-dd HH:mm:ss z" --> baseTime
\r
112 * @throws IOException
\r
113 * @throws ImageReadException
\r
115 public static void main(String[] argv) throws Exception
\r
117 if (argv.length < 5) {
\r
118 System.out.println("java Restamp <imgDir> <baseFile1> <timeStr1> <baseFile2> <timeStr2>");
\r
122 File imgDir = new File(argv[0]);
\r
123 if (!imgDir.exists()) {
\r
124 // "[error] <imgDir>が存在しません。"
\r
125 System.out.println(i18n.getString("msg.200"));
\r
128 if (!imgDir.isDirectory()) {
\r
129 // "[error] <imgDir>がフォルダじゃない"
\r
130 System.out.println(i18n.getString("msg.210"));
\r
134 File baseFile1 = new File(imgDir, argv[1]);
\r
135 if (!baseFile1.exists()) {
\r
136 // "[error] <baseFile1>が存在しません。"
\r
137 System.out.println(i18n.getString("msg.220"));
\r
140 if (!baseFile1.isFile()) {
\r
141 // "[error] <baseFile1>がファイルじゃない"
\r
142 System.out.println(i18n.getString("msg.230"));
\r
146 DateFormat df1 = new SimpleDateFormat(TIME_PATTERN);
\r
147 Date baseTime1 = df1.parse(argv[2]);
\r
149 File baseFile2 = new File(imgDir, argv[3]);
\r
150 if (!baseFile2.exists()) {
\r
151 // "[error] <baseFile2>が存在しません。"
\r
152 System.out.println(i18n.getString("msg.240"));
\r
155 if (!baseFile2.isFile()) {
\r
156 // "[error] <baseFile2>がファイルじゃない"
\r
157 System.out.println(i18n.getString("msg.250"));
\r
161 DateFormat df2 = new SimpleDateFormat(TIME_PATTERN);
\r
162 Date baseTime2 = df2.parse(argv[4]);
\r
164 Restamp obj = new Restamp();
\r
165 obj.setUp(imgDir, baseFile1, baseTime1, baseFile2, baseTime2);
\r
168 public File imgDir;
\r
169 public Date baseTime1;
\r
170 public Date baseTime2;
\r
171 public int bCount1 = 0;
\r
172 public int bCount2 = 0;
\r
173 public long span = 0;
\r
174 public ArrayList<File> jpgFiles = new ArrayList<>();
\r
175 public static ResourceBundle i18n = ResourceBundle.getBundle("i18n");
\r
177 @SuppressWarnings("Convert2Lambda")
\r
178 public void setUp(File imgDir, File baseFile1, Date baseTime1, File baseFile2, Date baseTime2) throws Exception {
\r
179 // 指定されたディレクトリ内のGPXファイルすべてを対象とする
\r
180 File[] files = imgDir.listFiles();
\r
181 java.util.Arrays.sort(files, new java.util.Comparator<File>() {
\r
183 public int compare(File file1, File file2){
\r
184 return file1.getName().compareTo(file2.getName());
\r
189 boolean base1 = false;
\r
190 boolean base2 = false;
\r
191 for (File file : files) {
\r
192 if (file.isFile()) {
\r
193 String filename = file.getName().toUpperCase();
\r
194 if (filename.toUpperCase().endsWith(".JPG")) {
\r
195 this.jpgFiles.add(file);
\r
196 bCount1 += (base1 ? 0 : 1);
\r
197 bCount2 += (base2 ? 0 : 1);
\r
198 if (file.getName().equals(baseFile1.getName())) {
\r
201 if (file.getName().equals(baseFile2.getName())) {
\r
209 // imgDir内の画像ファイルを処理する
\r
210 @SuppressWarnings("LocalVariableHidesMemberVariable")
\r
211 long span = baseTime2.getTime() - baseTime1.getTime();
\r
212 span = span / (bCount2 - bCount1);
\r
214 for (File jpgFile : this.jpgFiles) {
\r
215 long deltaMsec = (i - bCount1) * span;
\r
217 Calendar cal = Calendar.getInstance();
\r
218 cal.setTime(baseTime1);
\r
219 cal.add(Calendar.MILLISECOND, (int) deltaMsec);
\r
220 jpgFile.setLastModified(cal.getTimeInMillis());
\r
223 catch(Exception e) {
\r
224 e.printStackTrace();
\r
225 this.ex = new Exception(e);
\r
230 * 対象は '*.JPG' のみ対象とする
\r
234 public static boolean checkFile(String name) {
\r
235 return ((name != null) && name.toUpperCase().endsWith(".JPG"));
\r
239 * ファイル名の順序に並び替えるためのソートクラス
\r
243 static class FileSort implements Comparator<File> {
\r
245 public int compare(File src, File target){
\r
246 int diff = src.getName().compareTo(target.getName());
\r
255 class JpegFileFilter implements FilenameFilter {
\r
257 public boolean accept(File dir, String name) {
\r
258 return name.toUpperCase().matches(".*\\.JPG$");
\r