このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

EPS画像のサイズ(幅と高さ)の取得方法

発言者:じゅんや
( Date Friday, November 07, 2003 15:16:12 )


はじめまして。よろしくお願いします。

作業環境は、Mac G4でOSは10.2.4です。
ファイルメーカーPro6で画像データベースを作っています。

ファイルメーカーに「size」というフィールドを作り、
画像データ(EPS)の容量から計算させて「A3」「A4」などとJIS規格の
名称を入れるよう、つくりましたが、大量の画像データの中には、
EPSのJPEG圧縮されているモノもあり、データの実寸法から計算させるのが
最適と気付きました。が・・・

今まで、組んでいたスクリプトの "data"の部分を"width"や"height"
に変えるだけでは、スクリプトがエラーになってしまいます。

過去にGIFやJPEGの記事はあったようですが、EPSに関しては
見当たらなかったので、投稿させていただきました。

よろしくお願いいたします。

せうぞー さんからのコメント
( Friday, November 07, 2003 15:40:20 )

なぁんだ、EPSだったのか。。
fmj-mlにはそんなことは1行も書いてなかったのに。。。
だったら、答えは
%%BoundingBox:
を見よ。ですね。
ちなみに最初に1024byteを、、とかワケワカメ言っていた人もいたみたいだけど、
最近の流行^^としてtiffプレビューをアタマに付けるのが通例だから、上記のヘッダを探すようにしてあげないと。

→  このつづき?

せうぞー さんからのコメント
( Friday, November 07, 2003 15:44:35 )

っていうか
http://www.factory-1987.co.jp/Factory/FileMaker_Plug-in_folder/F-FileMaker_Plugin.html
を使うのが吉?

じゅんや さんからのコメント
( Friday, November 07, 2003 16:55:06 )

せうぞーさん、ありがとうございます。

そーでしよね、%%BoundingBox ですよね。
でも、その先が分からないんです。
ちなにみ、"data" を "%%BoundingBox"するだけじゃだめなんですよねぇ。

この際なんで、もうお願いします。

activate
set folderPath to (choose folder )
set fileList to list folder folderPath
repeat with name in fileList
  set pictureFile to (folderPath & name as string)
  set pictureFile3 to (folderPath as string)
  if folder of (info for (alias pictureFile)) = false then
      tell application "Finder"
        set dataSize to (size of file pictureFile)
      end tell
      tell application "ファイルメーカー Pro"
        activate
        set newRecord to create record
        go to newRecord
        set cell "ファイル名" of newRecord to name
        set cell "Folder" of newRecord to pictureFile3
        set cell "Size byte" of newRecord to dataSize
      end tell
  end if
end repeat

今までは上記のスクリプトを組んで"Size byte"計算させてたんですが、
先に書いた理由で、容量からではなく、寸法からの計算にしようと・・・

%%BoundingBox はなんとなく分かってたんですが、それをどー扱って
いいのやらさっぱり分かりません。

"bounds”ではだめなんですよねぇ?
下から3番目の「set cell "Width" of newRecord to dataSize」
で引っかかってしまいます。

教えてください、おねがいします。

それと、 →このつづき?  はリンク切れになってました。

Plug-in ver.1.0.1 Folder は、あせって読んでいるせいか、
よくわかりません。External("FImag-ImageInfo",引数)
ってのを使えばいいんですよねぇ?
引数っていうのが???

じゅんや さんからのコメント
( Friday, November 07, 2003 17:15:06 )

すいません。

>"bounds”ではだめなんですよねぇ?
>下から3番目の「set cell "Width" of newRecord to dataSize」
>で引っかかってしまいます。

間違ってました。
下から4番目の「 set cell "Size byte" of newRecord to dataSize」
です。

せうぞー さんからのコメント
( Friday, November 07, 2003 20:05:22 )

情報が集まらないで焦る気持ちはわかりますが、こうしてあちこちに情報が拡散してしまうと、なにがなんだかわかりませんよね。積み上がらないっていうか。
あっちでもお返事をいただいているようだし(笑)
わたしのサンプルScriptについてもなんのお返事もいただけてないので、さっぱり話が噛み合っていませんね。

>%%BoundingBox はなんとなく分かってたんですが、それをどー扱って
>いいのやらさっぱり分かりません。

どんなやり方でもいいんじゃないでしょうか?
Mac OS X環境ならgrep してその返り値をリスト処理してもいいだろうし。

のもと さんからのコメント
( Saturday, November 08, 2003 00:57:02 )

EPSについてはファイルフォーマットが公開されています。
データフォークプレビューの場合でもヘッダをきちんと読めば
どこからがPostscriptデータなのかわかるようになっています。
これを読んで理解できないとちょっとつらいんですが
スクリプトにするとこんな感じになります。

property winHead : "ナミモニ" --Windowsフォーマットの場合の頭4バイト
property EPSHead : "%!PS-Adobe-3.0 EPSF-3.0"

getEPSBounds(choose file)

on getEPSBounds(epsAlias)
  set fref to open for access epsAlias
  set head to read fref for 1000
  --PSコメントで始まらない場合はWindowsフォーマット
  if (text 1 thru 23 of head) ≠ EPSHead then
    if head does not start with winHead then error "Not EPS"
    set psPos to 0
    --バイトスワップしてlongを読み出す
    repeat with i from 8 to 5 by -1
      set psPos to psPos * 256 + (ASCII number (read fref from i for 1))
    end repeat
    --得られた数値はバイトオフセットなので1を足す
    set head to read fref from psPos + 1 for 1000
    if (text 1 thru 23 of head) ≠ EPSHead then error "Not EPS"
  end if
  set AppleScript's text item delimiters to "%%BoundingBox:"
  --BoundingBoxの次の単語4つがBounds
  return words 1 thru 4 of text item 2 of head
end getEPSBounds

この機会にファイルフォーマットの勉強もしてみましょう↓

→  EPSファイルフォーマットのpdf

のもと さんからのコメント
( Saturday, November 08, 2003 01:24:11 )

あ、ファイルを閉じてやらなきゃいけませんね。
end if のあとに
close access fref
を入れましょう。
データのピクセル数じゃなく大きさがわかればいいんですよね?
ピクセル数が知りたい場合は %ImageData: で始まる行を読まなきゃだめです。

のもと さんからのコメント
( Saturday, November 08, 2003 01:26:26 )

あぁ、そうだerrorで終わらしたらファイルが閉じられない
まぁ、その辺のエラー処理は自分で考えてやってみましょう。

じゅんや さんからのコメント
( Monday, November 10, 2003 18:16:02 )

のもとさん、ありがとうございます。

スクリプトエディタ上では、結果として欲しい値が返ってきました。が・・

フォルダごとバッチ処理はできないんでしょうか?

できれば、すでに作ってあるスクリプト(4つ目のコメントにある)
に組み込んで、ファイルメーカー上に「BoundingBox」とかゆう
フィールドを作って、そこに入るようにしたい!んですが。

じゅんや さんからのコメント
( Monday, November 10, 2003 18:27:09 )

せうぞーさん、お世話になってます。

教えていただいたサンプルですが、僕のPhotoshop のPlug-insに
「Scripting」フォルダがありませんでした。なぜでしょうか?

それと、画像の点数が大量のため、一点づつPSで開いての処理となると、
ちょっと使いづらくなるんですが、どうなんでしょう?
まだ、動かせてないんで、わからないんですが。

せうぞー さんからのコメント
( Monday, November 10, 2003 18:45:41 )

乗り掛かった舟なので。。。

>教えていただいたサンプルですが、僕のPhotoshop のPlug-insに
>「Scripting」フォルダがありませんでした。なぜでしょうか?

標準でインストールされないので。
http://www.adobe.com/support/downloads/detail.jsp?ftpID=1535

>ちょっと使いづらくなるんですが、どうなんでしょう?

だったらgrepで

%grep '^\%\%BoundingBox:' *.eps

でしょ。ASからdo shell scriptを呼んで、返り値をリスト処理してもいいし、、、
ってずっと言ってるつもりなんですが。。。;-(
#ちなみに野本さんのScriptより、ずっと早いはず(笑)

せうぞー さんからのコメント
( Monday, November 10, 2003 19:01:23 )

あ、しまった。EPSはバイナリな可能性もあるからこうだ。

grep --binary-files=text '^\%\%BoundingBox:' *.eps

すると(例えば)こんな感じでカレントディレクトリの *.epsファイルのBoundingBoxが一度にgetできます。

mno_10112.eps:%%BoundingBox: 0 0 113 127
mno_10134.eps:%%BoundingBox: 0 0 113 174
mno_10188.eps:%%BoundingBox: 0 0 113 127
mno_10208.eps:%%BoundingBox: 0 0 113 127
mno_10479.eps:%%BoundingBox: 0 0 113 127
mno_10626.eps:%%BoundingBox: 0 0 113 103

あとはスペースを区切りにしてリストにするか、FMでやらせるか。。。お好きなように。

じゅんや さんからのコメント
( Tuesday, November 11, 2003 13:01:05 )

せうぞーさん、ホントお世話になりっぱなしで、、、

本当にお恥ずかしいんですが・・・わかりません、「grep」。
以前作ったアップルスクリプトに追加できるんでしょうか?
入れるとしたら、何処にどういれればいいんでしょうか?



せうぞー さんからのコメント
( Tuesday, November 11, 2003 17:05:34 )

これでファイル名をキーにしてBoundsのリスト値をとれます。

set my_folder to choose folder

set my_folder to (quoted form of POSIX path of my_folder) as Unicode text
set my_bounds to do shell script ("cd " & my_folder & "; grep  --binary-files=text '^%%BoundingBox' *.eps")
set my_bounds to my as_replace(my_bounds, ":%%BoundingBox:", "") as Unicode text
set my_bounds to my as_split(return, my_bounds)
if my_bounds is not {} then
  set my_bounds_record to {}
  repeat with i in my_bounds
    set tmp_list to my as_split(" ", contents of i)
    set my_bounds_record to my_bounds_record & my list2record({contents of item 1 of tmp_list, contents of items 2 thru -1 of tmp_list})
  end repeat
end if
my_bounds_record
--|ほにゃらら.eps| of my_bounds_record



to as_split(thedelimit, theText)
  set oldDelim to AppleScript's text item delimiters
  set AppleScript's text item delimiters to thedelimit
  set tmpList to every text item of theText
  set AppleScript's text item delimiters to oldDelim
  return tmpList
end as_split

to as_replace(theText, orgStr, newStr)
  set oldDelim to AppleScript's text item delimiters
  set AppleScript's text item delimiters to orgStr
  set tmpList to every text item of theText
  set AppleScript's text item delimiters to newStr
  set tmpStr to tmpList as text
  set AppleScript's text item delimiters to oldDelim
  return tmpStr
end as_replace


to list2record(my_list)
  try
    {ヌclass usrfネ:my_list}'s x--ヌはopt+¥、ネはshift+ott¥
  on error msg
    run script text 16 thru -2 of msg
  end try
end list2record

P.S.
えっと、あんまり言いたくないんですけど、一言。
そもそもこの話題はfmj-mlでご発言のものです。
あなたは答えが得られてそれでも満足かもしれませんが、
こうやって、あちこちに尋ねられると、fmj-mlでは放置される状態になります。
それを情報の拡散といいます。
情報の蓄積という意味では、一種のルール違反です。
第一、fmjでいろいろな回答を寄せた人たち(わたしも含めて)に対して大変失礼な状態になっています。
すくなくともわたしはすごく不愉快でした。無視されたようで。

あなたはこうして、いくつかの回答を得たわけですから、
当然fmj-mlにもこの結果を報告する義務があると思います。
それがネットで質問する上で、最低のマナーではないでしょうか?


じゅんや さんからのコメント
( Tuesday, November 11, 2003 17:53:37 )

せうぞーさん。お世話になってます。

追伸の件、大変申し訳ありませんでした。
なにぶん、この手のやりとりが初めてなもので・・・
以後、充分気をつけます。

いろんな面で勉強させて頂きありがとうございました。


スクリプトの件ですが・・・

こんなにいっぱい書かなきゃいけないんですね。
こんなんじゃ、初心者が一人で考えてても無理でした。
重ね重ねありがとうございます。

ところで、3行目の"cd"ってなんですか?
3行目で「タイプ1のエラーが起きました」とでるんですが。

とおりすがり さんからのコメント
( Tuesday, November 11, 2003 21:51:58 )

> こんなにいっぱい書かなきゃいけないんですね。
> こんなんじゃ、初心者が一人で考えてても無理でした。

このスクリプトの中心は3行目のgrepのところだけですよ。
あとはリスト処理してるだけでしょ。
ちゃんと読めば理解できるのでは?

>ところで、3行目の"cd"ってなんですか?

うーん、これがわからないことにはどうしようもないってくらい基本中の基本です。
マルチポストの上に、何から何まで他人まかせですね(笑)

>3行目で「タイプ1のエラーが起きました」とでるんですが。

ちなみにうちではMac OS X 10.2.8とMac OS X 10.3.1で普通に動作しましたけど。

じゅんや さんからのコメント
( Tuesday, November 11, 2003 22:54:06 )

みなさん、大変御迷惑おかけしております。
まだまだ勉強不足なんですね。
出直します。