* @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
continue;\r
}\r
\r
- // itime <-- 画像ファイルの撮影時刻\r
- // ファイルの更新日時/EXIFの撮影日時\r
- //Date itime = changeLocalTime2GMT(new Date(image.lastModified()));\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
- itime = ImportPicture.toEXIFDate(dateTimeOriginal);\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|", 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
+ 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 (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
- 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
- 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
+ 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.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
+ 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.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
+ //---- 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 (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
- \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
- longitude = Math.abs(longitude);\r
- latitude = Math.abs(latitude);\r
- outputSet.setGPSInDegrees(longitude, latitude);\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