アフィリエイト広告を利用しています

2020年04月17日

写真データファイルに付く番号について_その2


写真に付けられている名前に

日付と時刻を自動的に付加するスクリプトを作成する

スクリプトを作ってふり直してみた

元のファイル名は「DSC_0171.JPG」だが、

ブログにアップロードしてみると、

タイトルは「2020‎03‎06_1048_DSC_0171.JPG」

となっている

しかしブログ文面に写真を貼り付けてみると、

ファイル名は

「E2808E2020E2808E03E2808E06_1048_DSC_0171.JPG」

となってしまった

実際のブログのテキストは、



<div style="text-align: center;"><a href="/dragonfl/file/undefined
/E2808E2020E2808E03E2808E06_1048_DSC_0171.JPG" target="_blank"><mg src="/dragonfl/file/undefined
/E2808E2020E2808E03E2808E06_1048_DSC_0171-thumbnail2.JPG" alt="‎2020‎03‎06_1048_DSC_0171.JPG"
border="0"></a></div>



このテキストに対しファイル名一覧から名前を

順番に置き換え、

ブログの写真添付文章を作っている

こんな名前になってしまったら、

スクリプトが動かせない

あくまでもファイル名は、

「2020‎03‎06_1048_DSC_0171.JPG」なのだから



これは今の文字体系UTF-8に関係すると考えた

最近の文字体系は複雑すぎる

それこそ昔は文字を1バイトで表現していた

1バイトとは8ビットで成り立つ

1ビットとはスイッチ1個と考えればよい

オンとオフで判断する

オンが1でオフがゼロだ

それを8個並べると、11111111

2進数で計算すると、

2^8=256だから256文字を表現できる

この中には数字と記号とアルファベットと

カナ文字が入っている

いや入っているのではなく、

単なる約束である

コードが「0x30」だったらゼロ「0」だよ

だから「0」と言うイメージを表示してね

と言うことだ

0xとは16進表示と言うこと

16進表示とは、一桁で0123456789ABCDEF

まで表すことができる

あくまでも一桁なので10以上はABCDEFとなる



1バイト文字の時は複数のコード表が用意されていて、

コード表を切り替えて

グラフィック文字や罫線を表現した

もっと古い話をすれば、

4ビットで数字を表していた

これを、デジットと呼ぶ

0000、全部オンで、1111

2進数だから値で表すと、

1+2+4+8で15、一桁で表すとFになる

私がコンピュータを始めた頃は、

この1バイトのコード体系ををEBCDIC、

(Extended Binary Coded Decimal Interchange Code、

エバックディック、拡張二進化十進コード)と呼んでいた

のちにASCII(American Standard Code for Information Interchange)

が現れ、

漢字を表すためにシフトJIS(Shift_JIS)なるものができた

半角文字と呼ばれるものは1バイトで表現できるが、

漢字は数が多いため1バイトでは表現しきれず、

2バイトが必要になった

2バイトでコードを表現すると、

2^16=65、536個の文字を管理することができる

この2バイト文字を全角文字と呼ぶ

しかしこの頃はまだグローバル化があまり進んでおらず、

企業内のシステムなどが主流であったため、

他国のことなど考える必要もなかった

きちんとしたルールも決められておらず、

半角以外のその国独自の文字などは

自由に空いているコード表の中に埋め込まれてしまった

インターネットなどが普及してくると、

他国で作られた文章などに文字化けが起きてきた

統一されていないのだから当然のことである

例えば、日本では漢字を割りふっている場所に、

中国ではそこに中国語が割り振られてくる

だからパソコンを立ち上げる時に、

言語国の指定が必要になってくる

そこで登場したのが、

Unicodeと呼ばれるもので、

これは文字コードの国際的な業界標準の一つで、

世界中の様々な言語の文字を収録し通し番号を割り当て、

同じコード体系のもとで文字を使用できるように

したものだ

しかし一長一短でそのまま使われることもなく、

例のごとくいろいろなものが派生してくる

その中で今一般的に使われているのがUTF-8

と言う規格で、

ASCIIと同じ部分は1バイトで文字を表現し、

そのほかの部分を2〜4バイトで表現する

可変長の符号化方式と呼ばれるものだ

話がそれてきているけれど、

そういう流れで文字に対する処理が

複雑になってきている

目に見える文字で中のコードを

判別できなくなってきている

また昔のことになってしまうが、

昔は半角全角が目で判断できたものが、

今では判別できない

ごちゃまぜである

コードと文字が1:1で表されていたものが、

今では1:nとなってきている

表に現れている文字の後ろに何があるのかが解からない

16進と言う言葉もあまり見かけなくなった



前出の「2020‎03‎06_1048_DSC_0171.JPG」が

ブログにアップすると

「E2808E2020E2808E03E2808E06_1048_DSC_0171.JPG」

と言う名前になったのはなぜか

スクリプトが返してきた文字は、

「?2020/?03/?06 ??10:48」であって、

16進で表記すると、

「0x3F323032302F3F30332F3F3036203F3F31303A3438」

である

今まで文字コードがどうのこうと言って来たし、

それで時間を大分つぶしてしまったが、

どうも文字コードが原因ではなさそうだ

ネットで「E2808」を調べて見るが、

サーバー側の文字変換で出現してきているようだ

たぶんサーバー側はPHPなどで作られていると思うから、

これ以上はもう私には解からない

しかし、スクリプトから返される日付情報に

余計なコードがあるのは見て明らかである

文字表示である「?」をコードで見ると「0x3F」が

どうも悪さをしている

ならば取ってしまおう

と言うことで

スクリプトではこの「0x3F」を除くことにする

出来上がったスクリプトで名前を置き換え

ブログにアップロードする

文字化けも起こらず

タイトルとファイル名も一致した

スクリプトがなぜ'0x3F'を付加して来たかは

未だ不明である



ファイル名に日付時刻を付加するスクリプトは

以下通り



'======================================================
'フォルダ単位の名前の変更を行う、但しJPG及びGIFを対象とす
'既存のファイル名の先頭に撮影日付と時刻を追加する
'形式は、yyyymmdd-hhmm_既存名.JPGとする <---hhmmが3桁の場合があるので頭ゼロで4桁固定とする 20190520
'
'対象フォルダにこのスクリプトを配置し、スクリプトを実行する
'拡張子は大文字で統一する 2018.07.20
'======================================================
'
'フォルダ名にスペース等が入っているとエラーになる
'MsgBoxは1バイト文字で最大約1024文字までしか表示出来ない
'
Option Explicit

Const cFiExt = "jpggif" '拡張子JPGとGIFを対象とする
dim FS
dim WShell
dim xMyPath
dim xLen

set FS=CreateObject("Scripting.FileSystemObject")
set WShell=CreateObject("Shell.Application")

'スクリプトのフォルダ名を取得
xMyPath=Replace(WScript.ScriptFullName, WScript.ScriptName, vbNullString)
if right(xMyPath,1)="\" then '右端が"\"の場合この"\"を削除
xLen=Len(xMyPath)
xMyPath=left(xMyPath,(xLen-1))
end if

FileRenameProc(xMyPath)

set FS = Nothing
set WShell=Nothing

'--------------------------------------------------
' ファイル名の変更
'--------------------------------------------------
Function FileRenameProc(pSourceFolder)

dim objFolder,objFiles,objFi,Fi
dim Arr,Arr2,xx,tmp,NewName,LL
dim xLen,Ix
dim getymdhm
dim NewName2
dim objWSFolder
dim xOneChr
dim xDate
dim xTime
dim xHH
dim xMM

Set objFolder = FS.GetFolder(pSourceFolder)
Set objFiles = objFolder.Files

Set objWSFolder=WShell.Namespace(pSourceFolder)

tmp = ""
For Each Fi in objFiles
Arr =Split(Fi.Name,".")
xx = LCase(Arr(1)) 'アルファベットの大文字を小文字に変換
LL = UCase(Arr(1)) 'アルファベットの小文字を大文字に変換
If InStr(cFiExt,xx) > 0 Then
set objFi = FS.GetFile(Fi)
'NewName=Arr(0) & "b" & "." & LL '拡張子は大文字で統一

'GetDetailsOFはWSHのメソッド、12は撮影日時のパラメータ
getymdhm=objWSFolder.GetDetailsOF(objWSFolder.ParseName(Fi.name),12)
'PutInClipboardText getymdhm
'余計な文字"&3F"が入っているので削除
NewName2=""
for Ix=1 to len(getymdhm)
xOneChr=mid(getymdhm,Ix,1)
if Hex(Asc(xOneChr)) <> "3F" then
NewName2=NewName2 + xOneChr
end if
next

Arr2 =Split(NewName2," ")
xDate=Arr2(0)
xTime=Arr2(1)
xDate=Replace(xDate,"/","") '日付の/を外す
xTime=Replace(xTime,":","") '時刻の:を外す
xTime=Right("0"&xTime,4)
NewName2=xDate & "_" & xTime '日付と時刻の間のスペースを_に変更->"-"はエラーになる

Ix=Instr(1,Arr(0),NewName2)
If Ix = 0 Then '
NewName=NewName2 & "_" & Arr(0) & "." & LL '拡張子は大文字で統一
tmp = tmp & Fi.name & "->" & NewName & vbCrLf
objFi.Name = NewName
Else '変更済み若しくは撮影日付がない
tmp = tmp & Fi.name & "->" & " no change" & vbCrLf
End If

End If

Next
MsgBox tmp '表示文字数制限あり

set objFi = Nothing
Set objFiles = Nothing
Set objFolder = Nothing

End Function

'クリップボードに出力
Public Sub PutInClipboardText(ByVal str)
Dim cmd

cmd = "cmd /c ""echo " & str & "| clip"""
CreateObject("WScript.Shell").Run cmd, 0
End Sub


これで写真の管理が楽になった

仕事を離れるとWindowsにこだわる必要がなくなる

何を作ろうかのアイデアも出なくなる

ボケ〜としていたところ、

新しいアイテムを見つけた

Pythonと言う言語

今までBASICが基本だと思っていたが、

人気言語を検索してもBASICが出てこない

今はPythonらしい

Pythonを調べていたらUnixが出てきて、

RaspberryPiなるものに興味が出てきた

今、RaspberryPiにはまってる

今度RaspberryPiについてのブログでも書こうかと

案を練っているところだ


20200306_1048_DSC_0171b.JPG
















※画像をクリックすると拡大表示します







タグ:スクリプト
posted by kaz at 16:59 | Comment(0) | TrackBack(0) | プログラム

2020年02月05日

写真データファイルに付く番号について


私のスマホSHカメラは、

撮った画像をDCIMフォルダに保存する。

画像イメージデータ(JPG)の名前は、

固定文字の後ろに連番がふられ管理されている。

SHの場合、

アプリ指定のフォルダに保存されている

名前の後半の一番大きな数字をもとに、

それに1を加算した番号をふっている。

だから、

そのフォルダの写真を移動したり削除すると、

採番数字は逆転となり

ファイル名は重複してしまう。

ちなみに現在のフォルダ名は101SHARP、

その前は100SHARPだった。

ファイル名は、DSC-0408.JPGなどと言う名前で表される。

最近はブログ用の写真もスマホで撮るケースが増えている。

通常のカメラ(一眼)は意識しないと持ち歩かないが、

スマホは既に体の一部であり、

付帯しないと不安になるから恐ろしい。

ある日、

ブログを書こうと写真をサーバーにアップロードし、

ブログテキストを入力してからプレビューをみると、

どうも表示されてくる写真がおかしい。

今アップロードした写真ではなく、

なぜか昔の写真が表示されて来る。

画面から確認してみると、

今回の写真は確かにアップロードされていおり、

一覧表にも表示されている。

写真に付いているタイトルも同じ名前だ。

では、なぜ昔の古い写真が表示されてしまうのか。

前述したように、

スマホの写真はアルファベット文字を頭に

連続番号で管理されている。

今回アップしたイメージファイル名の数字を見てみると、

前回書いたブログの写真の数字より

かなり若い数字が並んでいる。

数字が逆転している。

これでは画像データをユニークに管理することなどできない。

今回の名前に付いている数字の写真は、

既にブログに投稿済みのものであるから、

その写真が表示されている。

ではなぜ同じい名前で写真がアップロードできたのか。

それはブログを管理しているシステム側で

自動的にエイリアス(別称)化され、

物理的な名称は二重とはなっていないからだ。

例えば、ファイル名は「IMG_1858.JPG」が

「IMG_1858-9daa4.JPG」などのようになっている。

タイトルは両方とも、「IMG_1858」と言う名が付いているので、

画面で一覧しただけでは識別できない。

「-9daa4」については、

アプリの仕様であるから理由は解からない。

ではスマホのカメラ側では、

どうデータを管理しているのであろうか。

少し調べて見ると、

どうもスマホの写真保存フォルダDCIMの中の

一番大きな数字のファイル名が基準になっているようだ。

この数字に1を加算して

保存するファイルの名前としている。

その方法だと、

そのフォルダの中のファイルを勝手に移動できない。

なぜなら、

採番基準となるファイルを移動してしまったら、

または消してしまったら、

その数字を基準としているので、

採番基準が変わってしまうことになる。

ちなみにEOSカメラでは、

内部メモリにベース値が保存されているようなので、

採番数字は保存ファイルに依存していない。

しかし数字は有限なので、

9999になれば、次は0001になるのが

当たり前の話である。

スマホは保存する容量も限られているし、

ファイルを管理するには適さない。

何百もの写真をスマホに残しておくと、

何をするにも悲惨である。

ではどうするか。

スマホの中では、

指定フォルダを対象としているので、

その中の一番大きな数字を基準に

カウントアップするので、

ダブることはない。

しかし、

写真データをパソコンなどに移し替えた場合、

同じ名前がパソコンの中に存在してしまう可能性がある。

保存したフォルダが違っていればそれも分からないが、

ファイル名の番号だけでデータを管理していると

時系列が狂ってしまうので、

フォルダの外にファイルを出してしまうと、

ぐちゃぐちゃになってしまう。

ファイルには作成日や更新日なども持っているが、

変更などを加えると変わってしまうので使えない。

このままではきちんとデータを管理することができない。

ならば、ブログサーバーがやっていたように、

表向きの顔と裏向きの顔を変え、

ユニークな名前を付ける必要がある。

ではどのような名前にするのが一番良いのか考えた時、

ファイルの名前の中に

日付と時刻を入れるのが妥当であると結論づける。

そうすればファイル名で並び替えても時系列は変わらない。

写真データのタグ情報を見てみると、

時分までしか記録されていない。

1秒の間に連写すると

同じ時刻情報を持つファイルが複数発生する。

しかし、

カメラアプリでふられる連番があるので、

ファイル名としてはユニークとなり、

並び替えても順番の入り繰りはない。

どうやら日時情報は

名前の先頭に付けた方が良さそうだ。

これでルールは決まったが、

実作業はどうするのか。

まさか手作業でやる気は毛頭ない。

ここでプロラムの登場だ。

以前のブログでも書いたが、

スクリプトを作成し自動的に名前をふり直す方法を考える。

最初から簡単に処理ができるわけはないが、

手法をいろいろと模索する。

今までも音楽ファイルなどは

タグ情報を変更して保存しているので

写真データにもタグ情報があるはずだ。

実際、写真データも同じであって、

カメラが持っているほとんどの情報が

タグの中に記録さてている。

絞り、シャッタースピード、感度、カメラのメーカー、型式等、

沢山の情報を保有している。

問題はその情報をどうやって抜き出すかである。

例のごとくネット上の情報で探っていく。

机上で考えているとすぐに飽きてしまうので、

いつものようにカットアンドトライで進める。

早道なのか、遠回りなのか解からないが、

これが私のやり方だ。

以前作ったファイルを扱うスクリプトは、

FileSystem.Objectを使っていたが、

このオブジェクトは万能ではないらしい。

このオブジェクトには、

タグ情報を取得するコマンドがない。

作業を進めて行くうちに、

ファイルのタグ情報を操れるのは、

WSHのメソッドであることが解かってきた。

WSHとは、Windows Script Hostの略で、

今までスクリプトと呼んでいたのはVBSのことだ。

VBSとはVisual Basic Scriptのこと。

VBSはWSHの環境の中で動作する。

VBSから渡された命令をWSHが動かしている。

スクリプトを動作させるためには、

いくつかの解からないこと、

そしていくつかの問題点もあった。

それについては、「その2」で記述することにする。

タグ:スクリプト
posted by kaz at 21:25 | Comment(0) | TrackBack(0) | プログラム
リンク
access:
online:
ファン
検索
<< 2024年04月 >>
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        
最新記事
最新コメント
オレンジ色の猫が by オーナー (02/06)
オレンジ色の猫が by 翠星石 (01/23)
ドローンを修理する by kaz (03/14)
ドローンを修理する by obayashi (03/10)
タグクラウド
カテゴリアーカイブ
プロフィール