Skip to content

Instantly share code, notes, and snippets.

@Shinichi-Ohki
Last active July 26, 2020 14:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Shinichi-Ohki/d076ea05bf950acbef6bab7cf5aeb588 to your computer and use it in GitHub Desktop.
Save Shinichi-Ohki/d076ea05bf950acbef6bab7cf5aeb588 to your computer and use it in GitHub Desktop.
QooCam output JPEG file Date/Time adjuster

QooCam output JPEG/MP4 file Date/Time adjuster

  • Kandao製360°カメラ QooCamのQooCam Studio出力ファイル(JPEG/MP4)の日時を設定(修正)します。
  • これにより、撮影日がExif/XMPに登録されるのでGoogle Photoなどにアップロードした際に正しい時系列に登録できます。

必要なもの

ruby は2.7.1上で開発しました。たぶん2.5以降くらいで動くのでは
exiftoolはmacOSの場合brew install exiftoolでインストールできます(要Homebrew)
mini_exiftoolはgem install mini_exiftoolでインストールできます

qdate.rb

qdate.rb -i QooCamJPEGorMP4Filename

例: ruby qdate.rb -i Output_Q360_20191231_132020_000000.jpg

  • 直接JPEG/MP4ファイルを書き換えます。気になる方はJPEG/MP4ファイルのバックアップを取ってから使ってください。
  • ファイル名に含まれる日時をファイル内のExif/XMPの撮影日時に登録します
  • 具体的には
    • JPEGの時は
      • ExifのCreateDateタグとDateTimeOriginalタグにファイル名に含まれる日時を書き込みます
      • ExifのGPSDateStampタグ、GPSTimeStampタグにUTC(*)を設定します
      • ExifのOffsetTimeOriginalタグ、OffsetTimeDigitizedタグに時差(デフォルトでは+9:00)を設定します
      • ExifのMakeタグにKanDao、CameraModelNameタグにQooCamを設定します
    • MP4の時は
      • XMPのCreateDateにUTCを、ModifyDateにローカル日時(デフォルトでは+9:00)を書き込みます
      • ExifのMediaCreateDateにローカル日時(デフォルトでは+9:00)を書き込みます
  • (*)QooCamの時計が日本のタイムゾーン(JST)に合っている状態で撮影されたことを前提にしています。他のタイムゾーンに合わせてある場合は14行目のtzoneを変えてください

qtime.rb

qtime.rb -i QooCamJPEGFilename -t time

  • GPSDateStampタグ、GPSTimeStampタグに登録されているUTCから、現地日時を設定します
  • UTCからの差を-tに設定します(例:ホノルル -10、中国 8)
  • 1時間未満の差は(今のところ)設定できないです(ネパールのUTC+5:45とか)
  • 日本からの時差ではないことに注意してください

QooCam Studio 2との互換性

QooCam Studio 2でExif情報が元の写真からコピーされるようになりましたが、GPSDateStampタグ、GPSTimeStampタグは未設定のままなのでqtime.rbは使えません。一度qdate.rbなどでGPSDateStampタグ、GPSTimeStampタグを設定してからお使いください。

#!/usr/bin/env ruby
require 'optparse'
require 'mini_exiftool'
option_hash = {}
OptionParser.new{|opt|
opt.on('-i','--input JpegFilename' 'string JpegFilename') {|v| option_hash[:orgpathname] = v}
opt.parse!(ARGV)
}
orgpathname = ARGV[0]
tzone=9
photo = MiniExiftool.new(option_hash[:orgpathname])
dname = File.dirname(option_hash[:orgpathname])
fname = File.basename(option_hash[:orgpathname],File.extname(option_hash[:orgpathname]))
ename = File.extname(option_hash[:orgpathname])
#p dname
#p fname
#p ename
fnameary = fname.split('_')
orgtime = Time.parse(fnameary[2]+" "+fnameary[3])
utctime = Time.new
utctime = orgtime + (60*60*-(tzone))
p orgtime
p "#{orgtime.strftime("%Y-%m-%dT%H:%M:%S%z")}"
#p utctime
if ename =~ /\.[jpg|JPG]/ then
photo.DateTimeOriginal = orgtime
photo.CreateDate = orgtime
photo.Make = 'KanDao'
photo.Model = 'QooCam'
photo.GPSDateStamp = utctime.strftime("%Y:%m:%d")
photo.GPSTimeStamp = utctime.strftime("%H:%M:%S")
if tzone < 0 then
photo.OffsetTimeOriginal = "#{tzone}:00"
photo.OffsetTimeDigitized = "#{tzone}:00"
else
photo.OffsetTimeOriginal = "+#{tzone}:00"
photo.OffsetTimeDigitized = "+#{tzone}:00"
end
elsif ename =~ /\.[mp4|MP4]/ then
photo.ModifyDate = "#{orgtime.strftime("%Y-%m-%dT%H:%M:%S%z")}"
photo.MediaCreateDate = "#{orgtime.strftime("%Y-%m-%dT%H:%M:%S%z")}"
photo.CreateDate = "#{utctime.strftime("%Y-%m-%dT%H:%M:%SZ")}"
end
photo.save
#!/usr/bin/env ruby
require 'optparse'
require 'mini_exiftool'
option_hash = {}
OptionParser.new{|opt|
opt.on('-i','--input JpegFilename' 'string JpegFilename') {|v| option_hash[:orgpathname] = v}
opt.on('-t','--time value', 'integer Timeshift value') {|v| option_hash[:tzone] = v}
opt.parse!(ARGV)
}
#p option_hash
photo = MiniExiftool.new(option_hash[:orgpathname])
dname = File.dirname(option_hash[:orgpathname])
fname = File.basename(option_hash[:orgpathname],File.extname(option_hash[:orgpathname]))
ename = File.extname(option_hash[:orgpathname])
#p dname
#p fname
tzone = option_hash[:tzone].to_i
gpsdate = photo.GPSDateStamp.gsub(/:/,"\/")
gpstime = photo.GPSTimeStamp
utctime = Time.parse(gpsdate+' '+gpstime)
tgttime = Time.new
tgttime = utctime + (60*60*tzone)
print "UTC : #{utctime.strftime("%Y:%m:%D")} #{utctime.strftime("%H:%M:%S")}\n"
print "Target: #{tgttime.strftime("%Y:%m:%D")} #{tgttime.strftime("%H:%M:%S")}\n"
photo.DateTimeOriginal = tgttime
photo.CreateDate = tgttime
photo.save
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment