import java.util.Comparator;\r
import java.util.Date;\r
import java.util.Map;\r
+import java.util.ResourceBundle;\r
import java.util.TimeZone;\r
import java.util.logging.LogManager;\r
import java.util.logging.Logger;\r
import org.xml.sax.SAXException;\r
\r
public class ImportPicture extends Thread {\r
- /**\r
- * 実行中に発生したExceptionを保持する場所\r
- */\r
- public Exception ex = null;\r
+ \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
+ = "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
+ 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
+ // "ログ設定: LogManagerを設定しました。"\r
+ LOGGER.config("LoggerSettings: LogManager setuped.");\r
}\r
catch (IOException e) {\r
- logger.warning("ログ設定: LogManager設定の際に例外が発生しました。:" + e.toString());\r
+ // LogManager設定の際に例外が発生しました.\r
+ String str = "LoggerSettings: Exception occered:" + e.toString();\r
+ LOGGER.warning(str);\r
}\r
}\r
catch (UnsupportedEncodingException e) {\r
- logger.severe("ログ設定: UTF-8エンコーディングがサポートされていません。:" + e.toString());\r
+ String str = "LoggerSettings: Not supported 'UTF-8' encoding: " + e.toString();\r
+ LOGGER.severe(str);\r
}\r
finally {\r
try {\r
inStream.close();\r
}\r
} catch (IOException e) {\r
- logger.warning("ログ設定: ログ設定プロパティファイルのストリームクローズ時に例外が発生しました。:"+ e.toString());\r
+ String str = "LoggerSettings: Exception occored: "+ e.toString();\r
+ LOGGER.warning(str);\r
}\r
}\r
}\r
\r
-\r
-\r
/** メイン\r
* 画像ファイルをGPXファイルに取り込みます。\r
* \r
public boolean exifBase = false;\r
public ArrayList<File> gpxFiles = new ArrayList<>();\r
public AppParameters params;\r
- public boolean param_GpxSplit = false;\r
- public static boolean param_GpxNoFirstNode = false;\r
- public boolean param_GpxReuse = false;\r
- public boolean param_GpxOutputWpt = true;\r
- public boolean param_ImgOutputAll = false;\r
- public String param_GpxSourceFolder = ".";\r
+ public boolean param_GpxSplit = false;\r
+ public static boolean param_GpxNoFirstNode = false;\r
+ public boolean param_GpxReuse = false;\r
+ public boolean param_GpxOutputWpt = true;\r
+ public boolean param_ImgOutputAll = false;\r
+ public String param_GpxSourceFolder = ".";\r
\r
- \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
+ public ResourceBundle i18n = ResourceBundle.getBundle("i18n");\r
\r
public void setUp(String paramFilePath) throws Exception {\r
System.out.println("Param File = '"+ paramFilePath +"'");\r
this.imgDir = new File(this.params.getProperty(AppParameters.IMG_SOURCE_FOLDER));\r
\r
// 基準時刻(ファイル更新日時 | EXIF撮影日時)\r
- this.exifBase = (this.params.getProperty(AppParameters.GPX_BASETIME).equals("EXIF_TIME") ? true : false);\r
+ this.exifBase = (this.params.getProperty(AppParameters.GPX_BASETIME).equals("EXIF_TIME"));\r
\r
// 基準時刻ファイルの「更新日時」を使って時刻合わせを行う。\r
// argv[1] --> AppParameters.IMG_BASE_FILE に置き換え\r
// その他のパラメータを読み取る\r
String paramStr = this.params.getProperty(AppParameters.GPX_GPXSPLIT);\r
if ((paramStr != null) && (paramStr.equals(Boolean.toString(true)))) {\r
- this.param_GpxSplit = true;\r
+ this.param_GpxSplit = true;\r
}\r
\r
paramStr = this.params.getProperty(AppParameters.GPX_NO_FIRST_NODE);\r
if ((paramStr != null) && (paramStr.equals(Boolean.toString(true)))) {\r
- ImportPicture.param_GpxNoFirstNode = true;\r
+ ImportPicture.param_GpxNoFirstNode = true;\r
}\r
\r
paramStr = this.params.getProperty(AppParameters.GPX_REUSE);\r
if ((paramStr != null) && (paramStr.equals(Boolean.toString(true)))) {\r
- this.param_GpxReuse = true;\r
+ this.param_GpxReuse = true;\r
}\r
\r
paramStr = this.params.getProperty(AppParameters.IMG_OUTPUT_ALL);\r
if ((paramStr != null) && (paramStr.equals(Boolean.toString(true)))) {\r
- this.param_ImgOutputAll = true;\r
+ this.param_ImgOutputAll = true;\r
}\r
\r
paramStr = this.params.getProperty(AppParameters.GPX_OUTPUT_WPT);\r
if ((paramStr != null) && (paramStr.equals(Boolean.toString(true)))) {\r
- this.param_GpxOutputWpt = true;\r
+ this.param_GpxOutputWpt = true;\r
}\r
\r
paramStr = this.params.getProperty(AppParameters.GPX_OVERWRITE_MAGVAR);\r
if ((paramStr != null) && (paramStr.equals(Boolean.toString(true)))) {\r
- Complementation.param_GpxOverwriteMagvar = true;\r
+ Complementation.param_GpxOverwriteMagvar = true;\r
}\r
\r
paramStr = this.params.getProperty(AppParameters.GPX_OUTPUT_SPEED);\r
if ((paramStr != null) && (paramStr.equals(Boolean.toString(true)))) {\r
- Complementation.param_GpxOutputSpeed = true;\r
+ Complementation.param_GpxOutputSpeed = true;\r
}\r
\r
paramStr = this.params.getProperty(AppParameters.GPX_SOURCE_FOLDER);\r
if (paramStr != null) {\r
- this.param_GpxSourceFolder = new String(paramStr);\r
+ this.param_GpxSourceFolder = paramStr;\r
this.gpxDir = new File(this.param_GpxSourceFolder);\r
if (!this.gpxDir.exists()) {\r
- // GPXファイルまたはディレクトリが存在しません。\r
- System.out.println("GPXファイルまたはディレクトリが存在しません。('"+ paramStr +"')");\r
+ // GPXファイルまたはディレクトリが存在しません。('%s')\r
+ System.out.println(\r
+ String.format(i18n.getString("msg.100"), paramStr)\r
+ );\r
return;\r
}\r
}\r
if (this.gpxDir.isDirectory()) {\r
File[] files = this.gpxDir.listFiles();\r
if (files == null) {\r
- // 対象となるGPXファイルがありませんでした。\r
- System.out.println("対象となるGPXファイルがありませんでした。('"+ this.gpxDir.getAbsolutePath() +"')");\r
+ // 対象となるGPXファイルがありませんでした。('%s')\r
+ System.out.println(\r
+ String.format(i18n.getString("msg.110"), this.gpxDir.getAbsolutePath())\r
+ );\r
return;\r
}\r
if (this.param_ImgOutputAll && (files.length > 1)) {\r
- System.out.println("複数のGPXファイルがあるときには、'IMG.OUTPUT_ALL'オプションは指定できません。");\r
+ // "複数のGPXファイルがあるときには、'IMG.OUTPUT_ALL'オプションは指定できません。"\r
+ System.out.println(\r
+ i18n.getString("msg.120")\r
+ );\r
return;\r
}\r
\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
+ java.util.Arrays.sort(\r
+ 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
+ );\r
for (File file : files) {\r
if (file.isFile()) {\r
String filename = file.getName().toUpperCase();\r
\r
paramStr = this.params.getProperty(AppParameters.IMG_OUTPUT_EXIF);\r
if ((paramStr != null) && (paramStr.equals(Boolean.toString(true)))) {\r
- this.exif = true;\r
+ this.exif = true;\r
}\r
\r
String timeStr = this.params.getProperty(AppParameters.IMG_TIME);\r
this.delta = t.getTime() - imgtime.getTime();\r
}\r
catch (ParseException e) {\r
- System.out.println("'"+ timeStr +"' の書式が違います("+ TIME_FORMAT_STRING +")");\r
+ // "'%s'の書式が違います(%s)"\r
+ System.out.println(\r
+ String.format(\r
+ i18n.getString("msg.130"),\r
+ timeStr,\r
+ TIME_FORMAT_STRING\r
+ )\r
+ );\r
return;\r
}\r
\r
this.join();\r
} catch(InterruptedException end) {}\r
if (this.ex != null) {\r
- throw this.ex;\r
+ throw this.ex;\r
}\r
- \r
}\r
\r
+ /**\r
+ * @code{\r
+ <wpt lat="35.25714922" lon="139.15490497">\r
+ <ele>62.099998474121094</ele>\r
+ <time>2012-06-11T00:44:38Z</time>\r
+ <hdop>0.75</hdop>\r
+ <name><![CDATA[写真]]></name>\r
+ <cmt><![CDATA[精度: 3.0m]]></cmt>\r
+ <link href="2012-06-11_09-44-38.jpg">\r
+ <text>2012-06-11_09-44-38.jpg</text>\r
+ </link>\r
+ <sat>9</sat>\r
+ </wpt>\r
+ * }\r
+ */\r
@Override\r
public void run() {\r
- /**\r
- *\r
- <wpt lat="35.25714922" lon="139.15490497">\r
- <ele>62.099998474121094</ele>\r
- <time>2012-06-11T00:44:38Z</time>\r
- <hdop>0.75</hdop>\r
- <name><![CDATA[写真]]></name>\r
- <cmt><![CDATA[精度: 3.0m]]></cmt>\r
- <link href="2012-06-11_09-44-38.jpg">\r
- <text>2012-06-11_09-44-38.jpg</text>\r
- </link>\r
- <sat>9</sat>\r
- </wpt>\r
- */\r
try {\r
- if (params.getProperty(AppParameters.IMG_OUTPUT).equals(Boolean.toString(true))) {\r
+ if (params.getProperty(AppParameters.IMG_OUTPUT).equals(Boolean.toString(true))) {\r
outDir = new File(outDir, imgDir.getName());\r
- }\r
- else {\r
+ }\r
+ else {\r
outDir = gpxDir;\r
- }\r
-\r
+ }\r
for (File gpxFile : this.gpxFiles) {\r
procGPXfile(new GpxFile(gpxFile));\r
}\r
}\r
catch(ParserConfigurationException | DOMException | SAXException | IOException | ParseException | ImageReadException | ImageWriteException | IllegalArgumentException | TransformerException e) {\r
- e.printStackTrace();\r
- this.ex = new Exception(e);\r
+ e.printStackTrace();\r
+ this.ex = new Exception(e);\r
}\r
}\r
\r
void procGPXfile(GpxFile gpxFile) throws ParserConfigurationException, SAXException, IOException, ParseException, ImageReadException, ImageWriteException, TransformerException {\r
System.gc();\r
\r
- System.out.println(" 時差: "+ (delta / 1000) +"(sec)");\r
- System.out.println(" Target GPX: ["+ gpxFile.getAbsolutePath() +"]");\r
- System.out.println(" EXIF: "+ (exif ? ("convert to '" + outDir.getAbsolutePath() +"'") : "off"));\r
+ System.out.println("time difference: "+ (delta / 1000) +"(sec)");\r
+ System.out.println(" Target GPX: ["+ gpxFile.getAbsolutePath() +"]");\r
+ System.out.println(" EXIF: "+ (exif ? ("convert to '" + outDir.getAbsolutePath() +"'") : "off"));\r
System.out.println();\r
\r
// imgDir内の画像ファイルを処理する\r
- System.out.println("|--------------------------------|--------------------|--------------------|--------------|--------------|--------|------|------|");\r
- System.out.println("| name | Camera Time | GPStime | Latitude | Longitude | ele |magvar| km/h |");\r
- System.out.println("|--------------------------------|--------------------|--------------------|--------------|--------------|--------|------|------|");\r
- proc(imgDir, delta, gpxFile.mapTRKSEG, exif, gpxFile);\r
- System.out.println("|--------------------------------|--------------------|--------------------|--------------|--------------|--------|------|------|");\r
+ System.out.println("|--------------------------------|--------------------|--------------------|--------------|--------------|--------|------|------|");\r
+ System.out.println("| name | Camera Time | GPStime | Latitude | Longitude | ele |magvar| km/h |");\r
+ System.out.println("|--------------------------------|--------------------|--------------------|--------------|--------------|--------|------|------|");\r
+ proc(imgDir, delta, gpxFile.mapTRKSEG, exif, gpxFile);\r
+ System.out.println("|--------------------------------|--------------------|--------------------|--------------|--------------|--------|------|------|");\r
\r
// GPX出力\r
- gpxFile.output(outDir);\r
+ gpxFile.output(outDir);\r
}\r
\r
\r
public boolean ret;\r
public int control;\r
public Discripter(boolean ret) {\r
- this.ret = ret;\r
- this.control = Discripter.NEXT;\r
+ this.ret = ret;\r
+ this.control = Discripter.NEXT;\r
}\r
}\r
\r
ImageMetadata meta = Imaging.getMetadata(imageFile);\r
JpegImageMetadata jpegMetadata = (JpegImageMetadata)meta;\r
if (jpegMetadata == null) {\r
- System.out.println("'"+ imageFile.getAbsolutePath() +"' にEXIF情報がありません");\r
+ // "'%s'にEXIF情報がありません"\r
+ System.out.println(\r
+ String.format(\r
+ i18n.getString("msg.140"), \r
+ imageFile.getAbsolutePath()\r
+ )\r
+ );\r
result.control = Discripter.CONTINUE;\r
return result;\r
}\r
+ @SuppressWarnings("LocalVariableHidesMemberVariable")\r
TiffImageMetadata exif = jpegMetadata.getExif();\r
if (exif == null) {\r
- System.out.println("'"+ imageFile.getAbsolutePath() +"' にEXIF情報がありません");\r
+ // "'%s'にEXIF情報がありません"\r
+ System.out.println(\r
+ String.format(\r
+ i18n.getString("msg.140"), \r
+ imageFile.getAbsolutePath()\r
+ )\r
+ );\r
result.control = Discripter.CONTINUE;\r
return result;\r
}\r
- String dateTimeOriginal = exif.getFieldValue(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL)[0];\r
- itime = ImportPicture.toEXIFDate(dateTimeOriginal);\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
Date correctedtime = new Date(itime.getTime() + delta);\r
System.out.print(String.format("%20s|", toUTCString(correctedtime)));\r
\r
- // 時刻uktimeにおける<magver>をtrkptに追加する\r
+ // 時刻uktimeにおける<magver>をtrkptに追加する\r
String eleStr = "-";\r
String magvarStr = "-";\r
String speedStr = "-";\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
+ ElementMapTRKPT mapTRKPT = map.getValue();\r
+ trkptT = mapTRKPT.getValue(correctedtime);\r
if (trkptT != null) {\r
break;\r
}\r
longitude = trkptT.lon;\r
\r
if (trkptT.eleStr != null) {\r
- eleStr = new String(trkptT.eleStr);\r
+ eleStr = trkptT.eleStr;\r
}\r
\r
if (trkptT.magvarStr != null) {\r
- magvarStr = new String(trkptT.magvarStr);\r
+ magvarStr = trkptT.magvarStr;\r
}\r
\r
if (trkptT.speedStr != null) {\r
- speedStr = new String(trkptT.speedStr);\r
+ speedStr = 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
outDir.mkdir();\r
\r
if (exifWrite) {\r
- exifWrite(imageFile, correctedtime, trkptT);\r
+ exifWrite(imageFile, correctedtime, trkptT);\r
\r
if (Boolean.parseBoolean(params.getProperty(AppParameters.GPX_OUTPUT_WPT))) {\r
if (trkptT != null) {\r
}\r
}\r
else {\r
- if (this.param_ImgOutputAll) {\r
- // EXIFの変換を伴わない単純なファイルコピー\r
- FileInputStream sStream = new FileInputStream(imageFile);\r
- FileInputStream dStream = new FileInputStream(new File(outDir, imageFile.getName()));\r
+ if (this.param_ImgOutputAll) {\r
+ // EXIFの変換を伴わない単純なファイルコピー\r
+ FileInputStream sStream = new FileInputStream(imageFile);\r
+ FileInputStream dStream = new FileInputStream(new File(outDir, imageFile.getName()));\r
FileChannel srcChannel = sStream.getChannel();\r
FileChannel destChannel = dStream.getChannel();\r
try {\r
sStream.close();\r
dStream.close();\r
}\r
- }\r
+ }\r
}\r
result.control = Discripter.NEXT;\r
return result;\r
ImageMetadata meta = Imaging.getMetadata(imageFile);\r
JpegImageMetadata jpegMetadata = (JpegImageMetadata)meta;\r
if (jpegMetadata != null) {\r
+ @SuppressWarnings("LocalVariableHidesMemberVariable")\r
TiffImageMetadata exif = jpegMetadata.getExif();\r
if (exif != null) {\r
outputSet = exif.getOutputSet();\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.add(\r
+ 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
+ );\r
gpsDir.removeField(GpsTagConstants.GPS_TAG_GPS_DATE_STAMP);\r
gpsDir.add(GpsTagConstants.GPS_TAG_GPS_DATE_STAMP, dateStamp);\r
}\r
}\r
\r
//---- EXIF GPS_ ----\r
- outputSet.setGPSInDegrees(trkptT.lon.doubleValue(), trkptT.lat.doubleValue());\r
+ outputSet.setGPSInDegrees(trkptT.lon, trkptT.lat);\r
}\r
\r
ExifRewriter rewriter = new ExifRewriter();\r
try (FileOutputStream fos = new FileOutputStream(new File(outDir, imageFile.getName()))) {\r
rewriter.updateExifMetadataLossy(imageFile, fos, outputSet);\r
}\r
-\r
}\r
\r
// 基準時刻ファイルの「更新日時」を使って時刻合わせを行う。\r
ImageMetadata meta = Imaging.getMetadata(baseFile);\r
JpegImageMetadata jpegMetadata = (JpegImageMetadata)meta;\r
if (jpegMetadata == null) {\r
- System.out.println("'"+ baseFile.getAbsolutePath() +"' にEXIF情報がありません");\r
+ // "'%s'にEXIF情報がありません"\r
+ System.out.println(\r
+ String.format(\r
+ i18n.getString("msg.140"), \r
+ baseFile.getAbsolutePath()\r
+ )\r
+ );\r
return null;\r
}\r
+ @SuppressWarnings("LocalVariableHidesMemberVariable")\r
TiffImageMetadata exif = jpegMetadata.getExif();\r
if (exif == null) {\r
- System.out.println("'"+ baseFile.getAbsolutePath() +"' にEXIF情報がありません");\r
+ // "'%s'にEXIF情報がありません"\r
+ System.out.println(\r
+ String.format(\r
+ i18n.getString("msg.140"), \r
+ baseFile.getAbsolutePath()\r
+ )\r
+ );\r
return null;\r
}\r
- String dateTimeOriginal = exif.getFieldValue(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL)[0];\r
- return new Date(ImportPicture.toEXIFDate(dateTimeOriginal).getTime());\r
+ String dateTimeOriginal = exif.getFieldValue(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL)[0];\r
+ return new Date(ImportPicture.toEXIFDate(dateTimeOriginal).getTime());\r
}\r
else {\r
return new Date(baseFile.lastModified());\r
}\r
}\r
\r
- \r
/**\r
* 対象は '*.JPG' のみ対象とする\r
* @return \r
return ((name != null) && name.toUpperCase().endsWith(".JPG"));\r
}\r
\r
-\r
/**\r
* DateをEXIFの文字列に変換する。\r
* 注意:EXiFの撮影時刻はUTC時間ではない\r
* JPEGファイルフィルター\r
* @author yuu\r
*/\r
- class JpegFileFilter implements FilenameFilter {\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
+ public boolean accept(File dir, String name) {\r
+ return name.toUpperCase().matches(".*\\.JPG$");\r
}\r
- }\r
+ }\r
}
\ No newline at end of file