OSDN Git Service

refacterring
[importpicture/importpicture.git] / importPicture / src / osm / jp / gpx / ImportPicture.java
index 41fc070..901ca0c 100644 (file)
@@ -2,6 +2,7 @@ package osm.jp.gpx;
 \r
 import java.io.*;\r
 import java.nio.channels.FileChannel;\r
+import java.text.DateFormat;\r
 import java.text.DecimalFormat;\r
 import java.text.ParseException;\r
 import java.text.SimpleDateFormat;\r
@@ -120,6 +121,22 @@ public class ImportPicture extends Thread {
         ImportPicture obj = new ImportPicture();\r
         obj.params = new AppParameters(paramFilePath);\r
 \r
+        System.out.println(" - param: "+ AppParameters.IMG_TIME +"="+ obj.params.getProperty(AppParameters.IMG_TIME) );\r
+        System.out.println(" - param: "+ AppParameters.IMG_BASE_FILE +"="+ obj.params.getProperty(AppParameters.IMG_BASE_FILE) );\r
+        System.out.println(" - param: "+ AppParameters.GPX_BASETIME +"="+ obj.params.getProperty(AppParameters.GPX_BASETIME) );\r
+        System.out.println(" - param: "+ AppParameters.IMG_SOURCE_FOLDER +"="+ obj.params.getProperty(AppParameters.IMG_SOURCE_FOLDER) );\r
+        System.out.println(" - param: "+ AppParameters.IMG_OUTPUT_FOLDER +"="+ obj.params.getProperty(AppParameters.IMG_OUTPUT_FOLDER) );\r
+        System.out.println(" - param: "+ AppParameters.IMG_OUTPUT +"="+ obj.params.getProperty(AppParameters.IMG_OUTPUT));     \r
+        System.out.println(" - param: "+ AppParameters.IMG_OUTPUT_ALL +"="+ obj.param_ImgOutputAll);\r
+        System.out.println(" - param: "+ AppParameters.IMG_OUTPUT_EXIF +"= "+ String.valueOf(obj.exif));\r
+        System.out.println(" - param: "+ AppParameters.GPX_SOURCE_FOLDER +"="+ obj.param_GpxSourceFolder);\r
+        System.out.println(" - param: "+ AppParameters.GPX_OUTPUT_WPT +"="+ obj.param_GpxOutputWpt);\r
+        System.out.println(" - param: "+ AppParameters.GPX_OVERWRITE_MAGVAR +"="+ Complementation.param_GpxOverwriteMagvar);\r
+        System.out.println(" - param: "+ AppParameters.GPX_OUTPUT_SPEED +"="+ Complementation.param_GpxOutputSpeed);\r
+        System.out.println(" - param: "+ AppParameters.GPX_GPXSPLIT +"="+ obj.param_GpxSplit);\r
+        System.out.println(" - param: "+ AppParameters.GPX_NO_FIRST_NODE +"="+ ImportPicture.param_GpxNoFirstNode);        \r
+        System.out.println(" - param: "+ AppParameters.GPX_REUSE +"="+ obj.param_GpxReuse);\r
+\r
         obj.ex = null;\r
         // argv[0] --> AppParameters.IMG_SOURCE_FOLDER に置き換え\r
         obj.imgDir = new File(obj.params.getProperty(AppParameters.IMG_SOURCE_FOLDER));\r
@@ -143,7 +160,7 @@ public class ImportPicture extends Thread {
                 return;\r
             }\r
                String dateTimeOriginal = exif.getFieldValue(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL)[0];\r
-               long lastModifyTime = (new SimpleDateFormat("yyyy:MM:dd HH:mm:ss")).parse(dateTimeOriginal).getTime();\r
+               long lastModifyTime = ImportPicture.toEXIFDate(dateTimeOriginal).getTime();\r
                imgtime = new Date(lastModifyTime);\r
         }\r
         else {\r
@@ -242,28 +259,9 @@ public class ImportPicture extends Thread {
                obj.exif = true;\r
        }\r
        \r
-        System.out.println(" - param: imgDir = '"+ obj.imgDir.getAbsolutePath() +"'");\r
-        System.out.println(" - param: outDir = '"+ (obj.outDir == null ? "" : obj.outDir.getAbsolutePath()) +"'");\r
-        System.out.println(" - param: gpxDir = '"+ (obj.gpxDir == null ? "" : obj.gpxDir.getAbsolutePath()) +"'");\r
-        System.out.println(" - param: number of gpxFiles = '"+ obj.gpxFiles.size() +"'");\r
-        System.out.println(" - param: "+ AppParameters.GPX_GPXSPLIT +"="+ obj.param_GpxSplit);\r
-        System.out.println(" - param: "+ AppParameters.GPX_NO_FIRST_NODE +"="+ ImportPicture.param_GpxNoFirstNode);        \r
-        System.out.println(" - param: "+ AppParameters.GPX_REUSE +"="+ obj.param_GpxReuse);\r
-        System.out.println(" - param: "+ AppParameters.IMG_TIME +"="+ obj.params.getProperty(AppParameters.IMG_TIME) );\r
-        System.out.println(" - param: "+ AppParameters.IMG_BASE_FILE +"="+ obj.params.getProperty(AppParameters.IMG_BASE_FILE) );\r
-        System.out.println(" - param: "+ AppParameters.GPX_BASETIME +"="+ obj.params.getProperty(AppParameters.GPX_BASETIME) );\r
-        System.out.println(" - param: "+ AppParameters.IMG_OUTPUT +"="+ obj.params.getProperty(AppParameters.IMG_OUTPUT));     \r
-        System.out.println(" - param: "+ AppParameters.IMG_OUTPUT_ALL +"="+ obj.param_ImgOutputAll);\r
-        System.out.println(" - param: "+ AppParameters.IMG_OUTPUT_EXIF +"= "+ String.valueOf(obj.exif));\r
-        System.out.println(" - param: "+ AppParameters.GPX_SOURCE_FOLDER +"="+ obj.param_GpxSourceFolder);\r
-        System.out.println(" - param: "+ AppParameters.GPX_OUTPUT_WPT +"="+ obj.param_GpxOutputWpt);\r
-        System.out.println(" - param: "+ AppParameters.GPX_OVERWRITE_MAGVAR +"="+ Complementation.param_GpxOverwriteMagvar);\r
-        System.out.println(" - param: "+ AppParameters.GPX_OUTPUT_SPEED +"="+ Complementation.param_GpxOutputSpeed);\r
-\r
         String timeStr = obj.params.getProperty(AppParameters.IMG_TIME);\r
         try {\r
-            //dfjp.setTimeZone(TimeZone.getTimeZone("JST"));\r
-            Date t = dfuk.parse(timeStr);\r
+            Date t = toUTCDate(timeStr);\r
             obj.delta = t.getTime() - imgtime.getTime();\r
         }\r
         catch (ParseException e) {\r
@@ -296,8 +294,8 @@ public class ImportPicture extends Thread {
        public String param_GpxSourceFolder = ".";\r
     Document document;\r
        \r
-    public static final String TIME_FORMAT_STRING = "yyyy-MM-dd'T'HH:mm:ss";\r
-    public static final SimpleDateFormat dfuk = new SimpleDateFormat(TIME_FORMAT_STRING +"'Z'");\r
+    public static final String TIME_FORMAT_STRING = "yyyy-MM-dd'T'HH:mm:ss'Z'";\r
+    private static final String EXIF_DATE_TIME_FORMAT_STRING = "yyyy:MM:dd HH:mm:ss";\r
 \r
     @Override\r
     public void run() {\r
@@ -410,10 +408,6 @@ public class ImportPicture extends Thread {
      * @throws ImageWriteException \r
      */\r
     boolean proc(File dir, long delta, ElementMapTRKSEG mapTRKSEG, boolean exifWrite, Node gpx) throws ParseException, ImageReadException, IOException, ImageWriteException {\r
-        DecimalFormat yearFormatter = new DecimalFormat("0000");\r
-        DecimalFormat monthFormatter = new DecimalFormat("00");\r
-        DecimalFormat dayFormatter = new DecimalFormat("00");\r
-\r
         boolean ret = false;\r
         File[] files = dir.listFiles(new JpegFileFilter());\r
         Arrays.sort(files, new FileSort());\r
@@ -430,218 +424,219 @@ public class ImportPicture extends Thread {
                continue;\r
             }\r
             \r
-            // itime <-- 画像ファイルの撮影時刻\r
-            //                 ファイルの更新日時/EXIFの撮影日時\r
-            Date itime = new Date(image.lastModified());\r
-            if (this.exifBase) {\r
-                ImageMetadata meta = Imaging.getMetadata(image);\r
-                JpegImageMetadata jpegMetadata = (JpegImageMetadata)meta;\r
-                if (jpegMetadata == null) {\r
-                    System.out.println("'"+ image.getAbsolutePath() +"' にEXIF情報がありません");\r
-                    continue;\r
-                }\r
-                TiffImageMetadata exif = jpegMetadata.getExif();\r
-                if (exif == null) {\r
-                    System.out.println("'"+ image.getAbsolutePath() +"' にEXIF情報がありません");\r
-                    continue;\r
-                }\r
-               String dateTimeOriginal = exif.getFieldValue(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL)[0];\r
-               long lastModifyTime = (new SimpleDateFormat("yyyy:MM:dd HH:mm:ss")).parse(dateTimeOriginal).getTime();\r
-               itime = new Date(lastModifyTime);\r
+            Discripter result = procImageFile(image, delta, mapTRKSEG, exifWrite, gpx);\r
+            ret |= result.ret;\r
+            switch (result.control) {\r
+            case Discripter.CONTINUE:\r
+               continue;\r
+            case Discripter.BREAK:\r
+               break;\r
             }\r
-            System.out.print(String.format("%20s|", dfuk.format(itime)));\r
-\r
-            // uktime <-- 画像撮影時刻に対応するGPX時刻(補正日時)\r
-            Date uktime = new Date(itime.getTime() + delta);\r
-            System.out.print(String.format("%20s|", dfuk.format(uktime)));\r
-\r
-               // 時刻uktimeにおける<magver>をtrkptに追加する\r
-            String eleStr = "-";\r
-            String magvarStr = "-";\r
-            String speedStr = "-";\r
-            double latitude = 90.5D;\r
-            double longitude = 180.5D;\r
-            Element trkptE = null;\r
-            TagTrkpt trkptT = null;\r
-\r
-            for (Map.Entry<Date,ElementMapTRKPT> map : mapTRKSEG.entrySet()) {\r
-               ElementMapTRKPT mapTRKPT = map.getValue();\r
-                trkptE = mapTRKPT.getValue(uktime);\r
-                if (trkptE != null) {\r
-                    break;\r
-                }\r
+        }\r
+        return ret;\r
+    }\r
+    \r
+    class Discripter {\r
+       static final int NEXT = 0;\r
+       static final int CONTINUE = -1;\r
+       static final int BREAK = 1;\r
+       \r
+       public boolean ret;\r
+       public int control;\r
+       public Discripter(boolean ret) {\r
+               this.ret = ret;\r
+               this.control = Discripter.NEXT;\r
+       }\r
+    }\r
+    \r
+    Discripter procImageFile(File image, long delta, ElementMapTRKSEG mapTRKSEG, boolean exifWrite, Node gpx) throws ParseException, ImageReadException, IOException, ImageWriteException {\r
+        DecimalFormat yearFormatter = new DecimalFormat("0000");\r
+        DecimalFormat monthFormatter = new DecimalFormat("00");\r
+        DecimalFormat dayFormatter = new DecimalFormat("00");\r
+        \r
+        Discripter result = new Discripter(false);\r
+        \r
+        // itime <-- 画像ファイルの撮影時刻\r
+        //                     ファイルの更新日時/EXIFの撮影日時\r
+        Date itime = new Date(image.lastModified());\r
+        if (this.exifBase) {\r
+            ImageMetadata meta = Imaging.getMetadata(image);\r
+            JpegImageMetadata jpegMetadata = (JpegImageMetadata)meta;\r
+            if (jpegMetadata == null) {\r
+                System.out.println("'"+ image.getAbsolutePath() +"' にEXIF情報がありません");\r
+                result.control = Discripter.CONTINUE;\r
+                return result;\r
             }\r
-            if (trkptE == null) {\r
-                System.out.print(String.format("%-14s %-14s|", "", ""));\r
-                System.out.println(String.format("%8s|%6s|%6s|", "", "", ""));\r
-                if (!this.param_ImgOutputAll) {\r
-                       continue;\r
-                }\r
+            TiffImageMetadata exif = jpegMetadata.getExif();\r
+            if (exif == null) {\r
+                System.out.println("'"+ image.getAbsolutePath() +"' にEXIF情報がありません");\r
+                result.control = Discripter.CONTINUE;\r
+                return result;\r
             }\r
-            else {\r
-                trkptT = new TagTrkpt(trkptE);\r
-                latitude = trkptT.lat;\r
-                longitude = trkptT.lon;\r
-                \r
-                if (trkptT.eleStr != null) {\r
-                       eleStr = new String(trkptT.eleStr);\r
-                }\r
-                \r
-                if (trkptT.magvarStr != null) {\r
-                       magvarStr = new String(trkptT.magvarStr);\r
-                }\r
-                \r
-                if (trkptT.speedStr != null) {\r
-                       speedStr = new String(trkptT.speedStr);\r
-                }\r
-                System.out.print(String.format("%-14s %-14s|", (new Double(latitude)).toString(), (new Double(longitude)).toString()));\r
-                System.out.println(String.format("%8s|%6s|%6s|", eleStr, magvarStr, speedStr));\r
+               String dateTimeOriginal = exif.getFieldValue(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL)[0];\r
+               itime = ImportPicture.toEXIFDate(dateTimeOriginal);\r
+        }\r
+        System.out.print(String.format("%20s|", toUTCString(itime)));\r
+\r
+        // uktime <-- 画像撮影時刻に対応するGPX時刻(補正日時)\r
+        Date correctedtime = new Date(itime.getTime() + delta);\r
+        System.out.print(String.format("%20s|", toUTCString(correctedtime)));\r
+\r
+               // 時刻uktimeにおける<magver>をtrkptに追加する\r
+        String eleStr = "-";\r
+        String magvarStr = "-";\r
+        String speedStr = "-";\r
+        double latitude = 90.5D;\r
+        double longitude = 180.5D;\r
+        //Element trkptE = null;\r
+        TagTrkpt trkptT = null;\r
+\r
+        for (Map.Entry<Date,ElementMapTRKPT> map : mapTRKSEG.entrySet()) {\r
+               ElementMapTRKPT mapTRKPT = map.getValue();\r
+               trkptT = mapTRKPT.getValue(correctedtime);\r
+            if (trkptT != null) {\r
+                break;\r
             }\r
+        }\r
 \r
-            ret = true;\r
-            FileOutputStream fos = null;\r
-            outDir.mkdir();\r
+        if (trkptT == null) {\r
+            System.out.print(String.format("%-14s|%-14s|", "", ""));\r
+            System.out.println(String.format("%8s|%6s|%6s|", "", "", ""));\r
+            if (!this.param_ImgOutputAll) {\r
+                result.control = Discripter.CONTINUE;\r
+                return result;\r
+            }\r
+        }\r
+        else {\r
+            latitude = trkptT.lat;\r
+            longitude = trkptT.lon;\r
+            \r
+            if (trkptT.eleStr != null) {\r
+               eleStr = new String(trkptT.eleStr);\r
+            }\r
+            \r
+            if (trkptT.magvarStr != null) {\r
+               magvarStr = new String(trkptT.magvarStr);\r
+            }\r
+            \r
+            if (trkptT.speedStr != null) {\r
+               speedStr = new String(trkptT.speedStr);\r
+            }\r
+            //System.out.print(String.format("%-14s|%-14s|", (new Double(latitude)).toString(), (new Double(longitude)).toString()));\r
+            System.out.print(String.format("%14.10f|%14.10f|", latitude, longitude));\r
+            System.out.println(String.format("%8s|%6s|%6s|", eleStr, magvarStr, speedStr));\r
+        }\r
 \r
-            if (exifWrite) {\r
-                TiffOutputSet outputSet = null;\r
+        result.ret = true;\r
+        FileOutputStream fos = null;\r
+        outDir.mkdir();\r
 \r
-                ImageMetadata meta = Imaging.getMetadata(image);\r
-                JpegImageMetadata jpegMetadata = (JpegImageMetadata)meta;\r
-                if (jpegMetadata != null) {\r
-                    TiffImageMetadata exif = jpegMetadata.getExif();\r
-                    if (exif != null) {\r
-                        outputSet = exif.getOutputSet();\r
-                    }\r
-                }\r
+        if (exifWrite) {\r
+            TiffOutputSet outputSet = null;\r
 \r
-                if (outputSet == null) {\r
-                    System.out.println("added : new tiff output set");\r
-                    outputSet = new TiffOutputSet();\r
+            ImageMetadata meta = Imaging.getMetadata(image);\r
+            JpegImageMetadata jpegMetadata = (JpegImageMetadata)meta;\r
+            if (jpegMetadata != null) {\r
+                TiffImageMetadata exif = jpegMetadata.getExif();\r
+                if (exif != null) {\r
+                    outputSet = exif.getOutputSet();\r
                 }\r
+            }\r
 \r
-                //---- EXIF_TAG_DATE_TIME_ORIGINAL / 「撮影日時/オリジナル画像の生成日時」----\r
-                TiffOutputDirectory exifDir = outputSet.getOrCreateExifDirectory();\r
-                {\r
-                    Calendar cal = GregorianCalendar.getInstance();\r
-                    cal.setTime(uktime);\r
-                    exifDir.removeField(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL);\r
-                    exifDir.add(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL, new SimpleDateFormat("yyyy:MM:dd HH:mm:ss").format(cal.getTime()));\r
-                }\r
+            if (outputSet == null) {\r
+                System.out.println("added : new tiff output set");\r
+                outputSet = new TiffOutputSet();\r
+            }\r
 \r
-                //---- EXIF GPS_TIME_STAMP ----\r
-                TiffOutputDirectory gpsDir = outputSet.getOrCreateGPSDirectory();\r
-                {\r
-                    Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("UTC"));\r
-                    cal.setTime(uktime);\r
-                    final String yearStr = yearFormatter.format(cal.get(Calendar.YEAR));\r
-                    final String monthStr = monthFormatter.format(cal.get(Calendar.MONTH) + 1);\r
-                    final String dayStr = dayFormatter.format(cal.get(Calendar.DAY_OF_MONTH));\r
-                    final String dateStamp = yearStr +":"+ monthStr +":"+ dayStr;\r
-\r
-                    gpsDir.removeField(GpsTagConstants.GPS_TAG_GPS_TIME_STAMP);\r
-                    gpsDir.add(GpsTagConstants.GPS_TAG_GPS_TIME_STAMP,\r
-                            RationalNumber.valueOf(cal.get(Calendar.HOUR_OF_DAY)),\r
-                            RationalNumber.valueOf(cal.get(Calendar.MINUTE)),\r
-                            RationalNumber.valueOf(cal.get(Calendar.SECOND)));\r
-                    gpsDir.removeField(GpsTagConstants.GPS_TAG_GPS_DATE_STAMP);\r
-                    gpsDir.add(GpsTagConstants.GPS_TAG_GPS_DATE_STAMP, dateStamp);\r
-                }\r
+            //---- EXIF_TAG_DATE_TIME_ORIGINAL / 「撮影日時/オリジナル画像の生成日時」----\r
+            TiffOutputDirectory exifDir = outputSet.getOrCreateExifDirectory();\r
+            {\r
+                Calendar cal = GregorianCalendar.getInstance();\r
+                cal.setTimeZone(TimeZone.getTimeZone("UTC"));\r
+                cal.setTime(correctedtime);\r
+                exifDir.removeField(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL);\r
+                exifDir.add(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL, ImportPicture.toEXIFString(cal.getTime()));\r
+            }\r
 \r
-                if (trkptE != null) {\r
-                       //---- EXIF GPS elevation/ALTITUDE ----\r
-                       if (eleStr.equals("-") == false) {\r
-                           final double altitude = Double.parseDouble(eleStr);\r
-                           gpsDir.removeField(GpsTagConstants.GPS_TAG_GPS_ALTITUDE);\r
-                           gpsDir.add(GpsTagConstants.GPS_TAG_GPS_ALTITUDE, RationalNumber.valueOf(altitude));\r
-                       }\r
-       \r
-                       //---- EXIF GPS magvar/IMG_DIRECTION ----\r
-                       if (magvarStr.equals("-") == false) {\r
-                           final double magvar = Double.parseDouble(magvarStr);\r
-                           gpsDir.removeField(GpsTagConstants.GPS_TAG_GPS_IMG_DIRECTION);\r
-                           gpsDir.add(GpsTagConstants.GPS_TAG_GPS_IMG_DIRECTION, RationalNumber.valueOf(magvar));\r
-                       }\r
-       \r
-                       //---- EXIF GPS_ ----\r
-                    final String longitudeRef = (longitude < 0 ? "W" : "E");\r
-                    longitude = Math.abs(longitude);\r
-                    final String latitudeRef = (latitude < 0 ? "S" : "N");\r
-                    latitude = Math.abs(latitude);\r
-\r
-                    gpsDir.removeField(GpsTagConstants.GPS_TAG_GPS_LONGITUDE_REF);\r
-                    gpsDir.add(GpsTagConstants.GPS_TAG_GPS_LONGITUDE_REF, longitudeRef);\r
-                    gpsDir.removeField(GpsTagConstants.GPS_TAG_GPS_LATITUDE_REF);\r
-                    gpsDir.add(GpsTagConstants.GPS_TAG_GPS_LATITUDE_REF, latitudeRef);\r
-                    {\r
-                        double value = longitude;\r
-                        final double longitudeDegrees = (long) value;\r
-                        value %= 1;\r
-                        value *= 60.0;\r
-                        final double longitudeMinutes = (long) value;\r
-                        value %= 1;\r
-                        value *= 60.0;\r
-                        final double longitudeSeconds = value;\r
-                        gpsDir.removeField(GpsTagConstants.GPS_TAG_GPS_LONGITUDE);\r
-                        gpsDir.add(GpsTagConstants.GPS_TAG_GPS_LONGITUDE,\r
-                                RationalNumber.valueOf(longitudeDegrees),\r
-                                RationalNumber.valueOf(longitudeMinutes),\r
-                                RationalNumber.valueOf(longitudeSeconds));\r
-                    }\r
-                    {\r
-                        double value = latitude;\r
-                        final double latitudeDegrees = (long) value;\r
-                        value %= 1;\r
-                        value *= 60.0;\r
-                        final double latitudeMinutes = (long) value;\r
-                        value %= 1;\r
-                        value *= 60.0;\r
-                        final double latitudeSeconds = value;\r
-                        gpsDir.removeField(GpsTagConstants.GPS_TAG_GPS_LATITUDE);\r
-                        gpsDir.add(GpsTagConstants.GPS_TAG_GPS_LATITUDE,\r
-                                RationalNumber.valueOf(latitudeDegrees),\r
-                                RationalNumber.valueOf(latitudeMinutes),\r
-                                RationalNumber.valueOf(latitudeSeconds));\r
-                    }\r
-                }\r
+            //---- EXIF GPS_TIME_STAMP ----\r
+            TiffOutputDirectory gpsDir = outputSet.getOrCreateGPSDirectory();\r
+            {\r
+                Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("UTC"));\r
+                cal.setTimeZone(TimeZone.getTimeZone("GMT+00"));\r
+                cal.setTime(correctedtime);\r
+                final String yearStr = yearFormatter.format(cal.get(Calendar.YEAR));\r
+                final String monthStr = monthFormatter.format(cal.get(Calendar.MONTH) + 1);\r
+                final String dayStr = dayFormatter.format(cal.get(Calendar.DAY_OF_MONTH));\r
+                final String dateStamp = yearStr +":"+ monthStr +":"+ dayStr;\r
+\r
+                gpsDir.removeField(GpsTagConstants.GPS_TAG_GPS_TIME_STAMP);\r
+                gpsDir.add(GpsTagConstants.GPS_TAG_GPS_TIME_STAMP,\r
+                        RationalNumber.valueOf(cal.get(Calendar.HOUR_OF_DAY)),\r
+                        RationalNumber.valueOf(cal.get(Calendar.MINUTE)),\r
+                        RationalNumber.valueOf(cal.get(Calendar.SECOND)));\r
+                gpsDir.removeField(GpsTagConstants.GPS_TAG_GPS_DATE_STAMP);\r
+                gpsDir.add(GpsTagConstants.GPS_TAG_GPS_DATE_STAMP, dateStamp);\r
+            }\r
 \r
-                ExifRewriter rewriter = new ExifRewriter();\r
-                try {\r
-                    fos = new FileOutputStream(new File(outDir, imageName));\r
-                    rewriter.updateExifMetadataLossy(image, fos, outputSet);\r
+            if (trkptT != null) {\r
+                //---- EXIF GPS elevation/ALTITUDE ----\r
+                if (eleStr.equals("-") == false) {\r
+                    final double altitude = Double.parseDouble(eleStr);\r
+                    gpsDir.removeField(GpsTagConstants.GPS_TAG_GPS_ALTITUDE);\r
+                    gpsDir.add(GpsTagConstants.GPS_TAG_GPS_ALTITUDE, RationalNumber.valueOf(altitude));\r
                 }\r
-                finally {\r
-                    if (fos != null) {\r
-                        fos.close();\r
-                    }\r
+\r
+                //---- EXIF GPS magvar/IMG_DIRECTION ----\r
+                if (magvarStr.equals("-") == false) {\r
+                    final double magvar = Double.parseDouble(magvarStr);\r
+                    gpsDir.removeField(GpsTagConstants.GPS_TAG_GPS_IMG_DIRECTION);\r
+                    gpsDir.add(GpsTagConstants.GPS_TAG_GPS_IMG_DIRECTION, RationalNumber.valueOf(magvar));\r
                 }\r
 \r
-                if (Boolean.parseBoolean(params.getProperty(AppParameters.GPX_OUTPUT_WPT))) {\r
-                       if (trkptT != null) {\r
-                       Element temp = createWptTag(image, itime.getTime(), trkptT.trkpt);\r
-                        gpx.appendChild(temp);\r
-                       }\r
+                //---- EXIF GPS_ ----\r
+                longitude = Math.abs(longitude);\r
+                latitude = Math.abs(latitude);\r
+                outputSet.setGPSInDegrees(longitude, latitude);\r
+            }\r
+\r
+            ExifRewriter rewriter = new ExifRewriter();\r
+            try {\r
+                fos = new FileOutputStream(new File(outDir, image.getName()));\r
+                rewriter.updateExifMetadataLossy(image, fos, outputSet);\r
+            }\r
+            finally {\r
+                if (fos != null) {\r
+                    fos.close();\r
                 }\r
             }\r
-            else {\r
-               if (this.param_ImgOutputAll) {\r
-                       // EXIFの変換を伴わない単純なファイルコピー\r
-                       FileInputStream sStream = new FileInputStream(image);\r
-                       FileInputStream dStream = new FileInputStream(new File(outDir, imageName));\r
-                    FileChannel srcChannel = sStream.getChannel();\r
-                    FileChannel destChannel = dStream.getChannel();\r
-                    try {\r
-                        srcChannel.transferTo(0, srcChannel.size(), destChannel);\r
-                    }\r
-                    finally {\r
-                        srcChannel.close();\r
-                        destChannel.close();\r
-                        sStream.close();\r
-                        dStream.close();\r
-                    }\r
+\r
+            if (Boolean.parseBoolean(params.getProperty(AppParameters.GPX_OUTPUT_WPT))) {\r
+               if (trkptT != null) {\r
+                       Element temp = createWptTag(image, itime.getTime(), trkptT.trkpt);\r
+                    gpx.appendChild(temp);\r
                }\r
             }\r
         }\r
-        return ret;\r
+        else {\r
+               if (this.param_ImgOutputAll) {\r
+               // EXIFの変換を伴わない単純なファイルコピー\r
+                       FileInputStream sStream = new FileInputStream(image);\r
+                       FileInputStream dStream = new FileInputStream(new File(outDir, image.getName()));\r
+                FileChannel srcChannel = sStream.getChannel();\r
+                FileChannel destChannel = dStream.getChannel();\r
+                try {\r
+                    srcChannel.transferTo(0, srcChannel.size(), destChannel);\r
+                }\r
+                finally {\r
+                    srcChannel.close();\r
+                    destChannel.close();\r
+                    sStream.close();\r
+                    dStream.close();\r
+                }\r
+               }\r
+        }\r
+        result.control = Discripter.NEXT;\r
+        return result;\r
     }\r
        \r
     /**\r
@@ -765,6 +760,42 @@ public class ImportPicture extends Thread {
 \r
         return wpt;\r
     }\r
+    \r
+    /**\r
+     * DateをEXIFの文字列に変換する。\r
+     * 注意:EXiFの撮影時刻はUTC時間ではない\r
+     * @param localdate\r
+     * @return\r
+     */\r
+    public static String toEXIFString(Date localdate) {\r
+       DateFormat dfUTC = new SimpleDateFormat(EXIF_DATE_TIME_FORMAT_STRING);\r
+       return dfUTC.format(localdate);\r
+    }\r
+    \r
+    /**\r
+     * EXIFの文字列をDateに変換する。\r
+     * 注意:EXiFの撮影時刻はUTC時間ではない\r
+     * @param timeStr\r
+     * @return\r
+     * @throws ParseException\r
+     */\r
+    public static Date toEXIFDate(String timeStr) throws ParseException {\r
+       DateFormat dfUTC = new SimpleDateFormat(EXIF_DATE_TIME_FORMAT_STRING);\r
+       //dfUTC.setTimeZone(TimeZone.getTimeZone("UTC"));\r
+       return dfUTC.parse(timeStr);\r
+    }\r
+       \r
+    public static String toUTCString(Date localdate) {\r
+       DateFormat dfUTC = new SimpleDateFormat(TIME_FORMAT_STRING);\r
+       dfUTC.setTimeZone(TimeZone.getTimeZone("UTC"));\r
+       return dfUTC.format(localdate);\r
+    }\r
+       \r
+    public static Date toUTCDate(String timeStr) throws ParseException {\r
+       DateFormat dfUTC = new SimpleDateFormat(TIME_FORMAT_STRING);\r
+       dfUTC.setTimeZone(TimeZone.getTimeZone("UTC"));\r
+       return dfUTC.parse(timeStr);\r
+    }\r
        \r
     static String getShortPathName(File dir, File iFile) {\r
         String dirPath = dir.getAbsolutePath();\r