OSDN Git Service

"Restamp.main()"
authorhayashi <hayashi.yuu@gmail.com>
Sun, 1 Apr 2018 03:19:31 +0000 (12:19 +0900)
committerhayashi <hayashi.yuu@gmail.com>
Sun, 1 Apr 2018 03:19:31 +0000 (12:19 +0900)
.gitignore
importPicture/AdjustTime2.sh [deleted file]
importPicture/src/AdjustTime2.sh
importPicture/src/osm/jp/gpx/ImportPicture.java
importPicture/src/osm/jp/gpx/Restamp.java [new file with mode: 0644]
importPicture/test/osm/jp/gpx/RestampTest.java [new file with mode: 0644]

index 58236c9..81d9b6d 100644 (file)
@@ -13,3 +13,7 @@
 /importPicture/testdata/*~
 /importPicture/testdata/cameradata/
 /importPicture/testdata/output
+/importPicture/nbproject/private/
+/importPicture/build/
+/importPicture/dist/
+/leaflet/nbproject/private/
\ No newline at end of file
diff --git a/importPicture/AdjustTime2.sh b/importPicture/AdjustTime2.sh
deleted file mode 100755 (executable)
index cc5ff42..0000000
+++ /dev/null
@@ -1 +0,0 @@
-java -cp .:AdjustTime2.jar:commons-imaging-1.0-SNAPSHOT.jar osm.jp.gpx.matchtime.gui.AdjustTime
index cc5ff42..4a4f609 100644 (file)
@@ -1 +1 @@
-java -cp .:AdjustTime2.jar:commons-imaging-1.0-SNAPSHOT.jar osm.jp.gpx.matchtime.gui.AdjustTime
+java -cp .:AdjustTime2.jar:commons-imaging-1.0-SNAPSHOT.jar:commons-compress-1.14.jar osm.jp.gpx.matchtime.gui.AdjustTime
index f617918..0635e73 100644 (file)
@@ -516,7 +516,6 @@ public class ImportPicture extends Thread {
         }\r
 \r
         if (outputSet == null) {\r
-            System.out.println("added : new tiff output set");\r
             outputSet = new TiffOutputSet();\r
         }\r
 \r
diff --git a/importPicture/src/osm/jp/gpx/Restamp.java b/importPicture/src/osm/jp/gpx/Restamp.java
new file mode 100644 (file)
index 0000000..140b249
--- /dev/null
@@ -0,0 +1,248 @@
+package osm.jp.gpx;\r
+\r
+import java.io.*;\r
+import java.text.DateFormat;\r
+import java.text.SimpleDateFormat;\r
+import java.util.ArrayList;\r
+import java.util.Calendar;\r
+import java.util.Comparator;\r
+import java.util.Date;\r
+import java.util.logging.LogManager;\r
+import java.util.logging.Logger;\r
+import org.apache.commons.imaging.ImageReadException;\r
+\r
+/**\r
+ * 動画から一定間隔で切り出したIMAGEのファイル更新日時を書き換える\r
+ * \r
+ * @author yuu\r
+ */\r
+public class Restamp extends Thread {\r
+    /**\r
+     * 実行中に発生したExceptionを保持する場所\r
+     */\r
+    public Exception ex = null;\r
+       \r
+    /**\r
+     * ログ設定プロパティファイルのファイル内容\r
+     */\r
+    protected static final String LOGGING_PROPERTIES_DATA\r
+           = "handlers=java.util.logging.ConsoleHandler\n"\r
+           + ".level=FINEST\n"\r
+           + "java.util.logging.ConsoleHandler.level=INFO\n"\r
+           + "java.util.logging.ConsoleHandler.formatter=osm.jp.gpx.YuuLogFormatter";\r
+\r
+    /**\r
+     * static initializer によるログ設定の初期化\r
+     */\r
+    public static final Logger logger = Logger.getLogger("CommandLogging");\r
+    static {\r
+        InputStream inStream = null;\r
+        try {\r
+            inStream = new ByteArrayInputStream(LOGGING_PROPERTIES_DATA.getBytes("UTF-8"));\r
+            try {\r
+                LogManager.getLogManager().readConfiguration(inStream);\r
+                logger.config("ログ設定: LogManagerを設定しました。");\r
+            }\r
+            catch (IOException e) {\r
+                logger.warning("ログ設定: LogManager設定の際に例外が発生しました。:" + e.toString());\r
+            }\r
+        }\r
+        catch (UnsupportedEncodingException e) {\r
+            logger.severe("ログ設定: UTF-8エンコーディングがサポートされていません。:" + e.toString());\r
+        }\r
+        finally {\r
+            try {\r
+                if (inStream != null) {\r
+                    inStream.close();\r
+                }\r
+            } catch (IOException e) {\r
+                logger.warning("ログ設定: ログ設定プロパティファイルのストリームクローズ時に例外が発生しました。:"+ e.toString());\r
+            }\r
+        }\r
+    }\r
+\r
+    /**\r
+     * メイン\r
+     * 動画から一定間隔で切り出したIMAGEのファイル更新日時を書き換える\r
+     * \r
+     * ・画像ファイルの更新日付を書き換えます。(Exi情報は無視します)\r
+     *    ※ 指定されたディレクトリ内のすべての'*.jpg'ファイルを処理の対象とします\r
+     * ・画像は連番形式(名前順に並べられること)の名称となっていること\r
+     * \r
+     * パラメータ\r
+     * ・対象のフォルダ(ディレクトリ内のすべての'*.jpg'ファイルを処理の対象とします)\r
+     * ・基準となる画像\r
+     * ・基準画像の正しい日時\r
+     * ・画像ファイルの間隔(秒)\r
+     * \r
+     *  exp) $ java -cp .:AdjustTime.jar:commons-imaging-1.0-SNAPSHOT.jar  [AdjustTime.ini]\r
+     *  exp) > java -cp .;AdjustTime.jar;commons-imaging-1.0-SNAPSHOT.jar [AdjustTime.ini]\r
+     * \r
+     * 1. 予め、動画から画像を切り出す\r
+     *   ソースファイル(mp4ファイル); 「-i 20160427_104154.mp4」\r
+     *     出力先: 「-f image2 img/%06d.jpg」 imgフォルダに6桁の連番ファイルを差出力する\r
+     *   切り出し開始秒数→ 「-ss 0」 (ファイルの0秒から切り出し開始)\r
+     *   切り出し間隔; 「-r 30」 (1秒間隔=30fps間隔)\r
+     * ```\r
+     * $ cd /home/yuu/Desktop/OSM/20180325_横浜新道\r
+     * $ ffmpeg -ss 0  -i 20160427_104154.mp4 -f image2 -r 15 img/%06d.jpg\r
+     * ```\r
+     * \r
+     * 2. ファイルの更新日付を書き換える\r
+     * ```\r
+     * $ cd /home/yuu/Desktop/workspace/AdjustTime/importPicture/dist\r
+     * $ 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
+     * ```\r
+     * \r
+     * @param argv\r
+     * argv[0] = 画像ファイルが格納されているディレクトリ          --> imgDir\r
+     * argv[1] = 時刻補正の基準とする画像ファイル                      --> baseFile\r
+     * argv[2] = 基準画像ファイルの精確な撮影日時 "yyyy-MM-dd_HH:mm:ss" --> baseTime\r
+     * argv[3] = 時刻補正の基準とする画像ファイル                      --> baseFile\r
+     * argv[4] = 基準画像ファイルの精確な撮影日時 "yyyy-MM-dd_HH:mm:ss" --> baseTime\r
+     * \r
+     * @throws IOException\r
+     * @throws ImageReadException \r
+     */\r
+    public static void main(String[] argv) throws Exception\r
+    {\r
+        if (argv.length < 5) {\r
+            System.out.println("java Restamp <imgDir> <baseFile1> <timeStr1> <baseFile2> <timeStr2>");\r
+            return;\r
+        }\r
+        \r
+        File imgDir = new File(argv[0]);\r
+        if (!imgDir.exists()) {\r
+            System.out.println("[error] <imgDir>が存在しません。");\r
+            return;\r
+        }\r
+        if (!imgDir.isDirectory()) {\r
+            System.out.println("[error] <imgDir>がフォルダじゃない");\r
+            return;\r
+        }\r
+        \r
+        File baseFile1 = new File(imgDir, argv[1]);\r
+        if (!baseFile1.exists()) {\r
+            System.out.println("[error] <baseFile1>が存在しません。");\r
+            return;\r
+        }\r
+        if (!baseFile1.isFile()) {\r
+            System.out.println("[error] <baseFile1>がファイルじゃない");\r
+            return;\r
+        }\r
+        \r
+        DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd'_'HH:mm:ss");\r
+       Date baseTime1 = df1.parse(argv[2]);\r
+\r
+        File baseFile2 = new File(imgDir, argv[3]);\r
+        if (!baseFile2.exists()) {\r
+            System.out.println("[error] <baseFile2>が存在しません。");\r
+            return;\r
+        }\r
+        if (!baseFile2.isFile()) {\r
+            System.out.println("[error] <baseFile2>がファイルじゃない");\r
+            return;\r
+        }\r
+        \r
+        DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd'_'HH:mm:ss");\r
+       Date baseTime2 = df2.parse(argv[4]);\r
+\r
+        Restamp obj = new Restamp();\r
+        obj.setUp(imgDir, baseFile1, baseTime1, baseFile2, baseTime2);\r
+    }\r
+    \r
+    public File imgDir;\r
+    public Date baseTime1;\r
+    public Date baseTime2;\r
+    public int bCount1 = 0;\r
+    public int bCount2 = 0;\r
+    public long span = 0;\r
+    public ArrayList<File> jpgFiles = new ArrayList<>();\r
+       \r
+    @SuppressWarnings("Convert2Lambda")\r
+    public void setUp(File imgDir, File baseFile1, Date baseTime1,  File baseFile2, Date baseTime2) throws Exception {\r
+       // 指定されたディレクトリ内のGPXファイルすべてを対象とする\r
+        File[] files = imgDir.listFiles();\r
+        java.util.Arrays.sort(files, new java.util.Comparator<File>() {\r
+            @Override\r
+            public int compare(File file1, File file2){\r
+                return file1.getName().compareTo(file2.getName());\r
+            }\r
+        });\r
+        bCount1 = 0;\r
+        bCount2 = 0;\r
+        boolean base1 = false;\r
+        boolean base2 = false;\r
+        for (File file : files) {\r
+            if (file.isFile()) {\r
+                String filename = file.getName().toUpperCase();\r
+                if (filename.toUpperCase().endsWith(".JPG")) {\r
+                    this.jpgFiles.add(file);\r
+                    bCount1 += (base1 ? 0 : 1);\r
+                    bCount2 += (base2 ? 0 : 1);\r
+                    if (file.getName().equals(baseFile1.getName())) {\r
+                        base1 = true;\r
+                    }\r
+                    if (file.getName().equals(baseFile2.getName())) {\r
+                        base2 = true;\r
+                    }\r
+                }\r
+            }\r
+        }\r
+\r
+        try {\r
+            // imgDir内の画像ファイルを処理する\r
+            long span = baseTime2.getTime() - baseTime1.getTime();\r
+            span = span / (bCount2 - bCount1);\r
+            int i = 0;\r
+            for (File jpgFile : this.jpgFiles) {\r
+                long deltaMsec = (i - bCount1) * span;\r
+                i++;\r
+                Calendar cal = Calendar.getInstance();\r
+                cal.setTime(baseTime1);\r
+                cal.add(Calendar.MILLISECOND, (int) deltaMsec);\r
+                jpgFile.setLastModified(cal.getTimeInMillis());\r
+            }\r
+        }\r
+        catch(Exception e) {\r
+            e.printStackTrace();\r
+            this.ex = new Exception(e);\r
+        }\r
+    }\r
+    \r
+    /**\r
+     * 対象は '*.JPG' のみ対象とする\r
+     * @return \r
+     * @param name\r
+     */\r
+    public static boolean checkFile(String name) {\r
+        return ((name != null) && name.toUpperCase().endsWith(".JPG"));\r
+    }\r
+\r
+    /**\r
+     * ファイル名の順序に並び替えるためのソートクラス\r
+     * \r
+     * @author hayashi\r
+     */\r
+    static class FileSort implements Comparator<File> {\r
+        @Override\r
+        public int compare(File src, File target){\r
+            int diff = src.getName().compareTo(target.getName());\r
+            return diff;\r
+        }\r
+    }\r
+\r
+    /**\r
+     * JPEGファイルフィルター\r
+     * @author yuu\r
+     */\r
+    class JpegFileFilter implements FilenameFilter {\r
+       @Override\r
+        public boolean accept(File dir, String name) {\r
+            if (name.toUpperCase().matches(".*\\.JPG$")) {\r
+                    return true;\r
+            }\r
+            return false;\r
+       }\r
+    }\r
+}
\ No newline at end of file
diff --git a/importPicture/test/osm/jp/gpx/RestampTest.java b/importPicture/test/osm/jp/gpx/RestampTest.java
new file mode 100644 (file)
index 0000000..caa8c3c
--- /dev/null
@@ -0,0 +1,56 @@
+package osm.jp.gpx;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/**
+ *
+ * @author yuu
+ */
+public class RestampTest {
+    
+    public RestampTest() {
+    }
+    
+    @BeforeClass
+    public static void setUpClass() {
+    }
+    
+    @AfterClass
+    public static void tearDownClass() {
+    }
+    
+    @Before
+    public void setUp() {
+    }
+    
+    @After
+    public void tearDown() {
+    }
+
+    /**
+     * Test of main method, of class Restamp.
+     */
+    @Test
+    public void testMain() {
+        try {
+            System.out.println("main");
+            String[] argv = new String[]{
+                "/home/yuu/Desktop/OSM/20180325_横浜新道/img",
+                "000033.jpg",
+                "2018-03-25_12:20:32",
+                "003752.jpg",
+                "2018-03-25_13:22:42"
+            };
+            Restamp.main(argv);
+        }
+        catch (Exception e) {
+            fail();
+        }
+    }
+
+}