カテゴリー
AdobeユーザーコミュニティでおなじみのTenAとイラストレータあい(AI)のDTPとデザインおたすけサイト(^-^)/

JPGツール

非常に単純なのですが、JPG画像の縦横ピクセルの数値を簡便に拾い出したいと言うのが事の起こりなのです。簡単なのはAdobe社謹製のExternalObjectを利用してExifからPixelDimension拾うのが楽なのですが、メタデータがなかったり、中途半端に削除されていてメタデータにアクセス出来るもののデータが取り出せない等の場合は全く役立たずなのです。このExternalObject君自体、メタデータがある事前提で見に行っちゃうので少々面倒くさい子だったりします。
ですので、全てのJPGファイルに利用出来る訳ではないのです。そういった場合、自前のライブラリを用意してなんとかする事になる訳です。
と言う事なので、基本的な情報だけでもさらりと読み出せる様にしてみました。

jpgtool = {
     precision : 0,
     components : 0,
     width : 0,
     height : 0,
     getInfo : function(f){
          f.encoding = ‘BINARY’;
          var str = “”;
          var bds = [];
          if (f.open(“r”)){
               while(f.tell()<32000){
                    var d = jpgtool.readByte(f);
                    if (d==0xff){
                         d = jpgtool.readByte(f);
                         if (d==0xc0){
                              bds = jpgtool.getValue(f);
                              }
                         }
                    }
               f.close();
               }
          return this;
          },
     getValue : function(f){
          jpgtool.readUShort(f);
          this.precision = jpgtool.readByte(f);
          this.height = jpgtool.readUShort(f);
          this.width = jpgtool.readUShort (f);
          this.components = jpgtool.readByte(f);
            //return this;
          },
     readByte : function(targetFile){
          return targetFile.readch().charCodeAt(0);;
          },
     readUShort : function(targetFile){
          var result = targetFile.readch().charCodeAt(0) * 256;
          result += targetFile.readch().charCodeAt(0);
          return result;
          }
     }

こーんな感じのオブジェクトなんですが、バイナリを読み出してヘッダ部分にある基本情報を返してくれる物です。取り出せるのは縦横ピクセル数、チャンネル数、各チャンネルの深度です。
やってる事も非常に単純で、マーカーを探して順番に値を読み出すだけと言う物ですので解説はご容赦下さい。
使い方は、

alert (jpgtool.getInfo (File.openDialog (“select JPG File.”)).components);

この様にgetInfo一発で取り出す事が可能です。

var val = jpgtool.getInfo(File.openDialog (“select JPG File.”));
var tx = “width = ” + val.width + “\n”;
tx += “height = ” + val.height + “\n”;
tx += “precision = ” + val.precision + “\n”;
tx += “components = ” + val.components;
alert (tx);

通常はこんな感じで呼び出せばいいんじゃないですかね…下の様な感じでデータを拾ってます。

jpgtool_sample.png

コメントを残す

Translate »