覚え書き。AdobeのjavaScriptで、PhotoShopが自動化できるらしい。
形式はAdobeによるJavaScript-eXtendらしく、.jsx。
調べてみると、これが結構強力。
やりたかった事は以下
1、フォルダ内の画像ファイルをすべて展開
2、切り出し位置が書いてある記述ファイルを別途読み込み、数値データ用意
3、数値データで画像を処理
4、指定フォルダに一括書き出し
できるとなー、ファイル更新とか素敵な時間削減になるんだ。
悩む事数時間、
、、、、で、でけた!
ワンクリックで数百枚の画像の最適化処理+アイコン作成+URLリンク作成が瞬殺ですよ。
詰まったのは、画像データ読み込みと、切り出しデータ読み込みの部分。
Adobe独自のJavaScriptAPIを使うのだけれど、情報が少ない。
1、画像ファイル展開
//open()
var folderName = "画像データ置き場";
var fileList = new Folder (folderName).getFiles ("*.*");
for ( docNo = 0; docNo < fileList.length; docNo ++ ) {
var fileRef = new File(fileList[docNo]);
open (fileRef);
}
コレで全部のデータが一気に開く。
2、記述ファイルの読み込み
//readIndexData()
var scriptfile = File.openDialog("読み込むファイルを選んでください","JSX-Script(*.jsx *.js):*.JSX;*.sJS;*.*");
if (scriptfile) {
var myOpenfile = new File(scriptfile);
myOpenfile.open("r");
var myContent;
for (i = 0; !myOpenfile.eof; i++) {
myContent += (myOpenfile.readln()+",");
}
}
データは、今のところExcel表→CSV出力で作成。","区切りでデータが出るのだが、テーブルの右ハジに関しては","が足されないという事が判明。流石だExcel、イライラさせてくれる。 己の無知だとしたら後で訂正。
readln()で読み込んで自分で","を足す。
悩ましかったのは最後のfor~部分。できるだけ適当なデータ形式(長さが不定)を読み込みたかったため、
eofで判定を入れてみた。 ウマー。JavaScript、適当ですな。
最後に、配列を用意し","でsplitした値を流し込んで、完了。
var fileName;
var itemNum = 6;
var alt = myContent.split (",");//カンマ抜きで、分割した文字数を出す
var itemLength = Math.floor(alt.length/itemNum);
fileName = new Array (itemLength);
for (j = 0; j < alt.length; j++) {
index = Math.floor(j/itemNum);
if (j%itemNum == 0) fileName[index]=alt[j];
}
3、画像処理(というか保存画像命名スタイル)
1の方法で画像を開くと、そのまま最前面にあるファイルからフォーカスがあたる。
PhotoShopでの処理は展開しないと動かない。
利点は、展開処理が一斉に行われるので時間効率とメモリ効率がいいこと。
ただし、
・開く順番はフォルダ内のファイル名依存となる。開く順が想定できないので、処理順が特定できない。
・管理するときに面倒くさいので、処理するファイル名は変えたくない。すぐミッシングしていやん。
・連番処理を考えると、画像を足すたびにガンガンずれて処理が嫌になるのが目に見えてる。
そこで、開いているドキュメントの名前を取得し、2で出たファイル名データfileNameと一致をとる。
一致したナンバーを出力ファイルにつける事で、記述ファイルの上から順についている番号で命名できる。
var docNoSum = documents.length; // 開いているファイルの合計数
var docNo; // カウンタ用変数
//Execute()
for ( docNo = 0; docNo < docNoSum; docNo ++ ) {//現在開いてるファイルカウント
var srcDoc = activeDocument; // 現在アクティブなドキュメント
var myName = srcDoc.name.split( "." )[0]; // ファイル名の取得
for (i = 0; i < fileName.length; i++) {
if (myName == fileName[i]) {
alert (myName+"_NameHIT!_"+fileName[i]+"/num_"+i);
contentNo = i;
saveName = "00"+contentNo; // ナンバリング
if (10 <= contentNo) saveName = "0"+contentNo;
if (100 <= contentNo) saveName = contentNo;
}
}
//saveNameが保存時のファイル名連番部分になる。やりたい処理を書く
}
うん、便利。
一致部分はかなりやっつけなので、αレベルのものという事で。
どうなんじゃろ。無駄だな。。 モノが1000枚とかになると、どっちにしてもPhotoShopが死ぬか。
再考の余地あり。
4、保存。 ここではJpegで保存
//createContents()
var saveFileJPG = new File("保存先フォルダ"+ saveName+".jpg" ); // 保存パスJPG
//JPEGで保存
var jpgSaveOpt = new JPEGSaveOptions(); // JPEG保存設定
jpgSaveOpt.quality = outQuality; // JPEGクオリティ
jpgSaveOpt.embedColorProfile = false; //埋め込みカラー設定
jpgSaveOpt.formatOptions = FormatOptions.OPTIMIZEDBASELINE;//フォーマット
srcDoc.saveAs( // 保存
saveFileJPG, // 保存パス
jpgSaveOpt, // JPEG保存設定
true, // 複製保存
Extension.LOWERCASE ); // 拡張子は小文字
以上。
コレ以外に、
・画像サイズを取得して選り分ける
・各辺の最大サイズを指定して、画像のアスペクト比を保ったまま縮小
・指定位置からroundRectのサムネイルを作る
・画像名と表示位置をリストとして出力
・htmlを出力
とかやってみた。 モジュール化して作る癖がついてきたので、複数jsxに分解したいですね。
チェーン形式のメソドが作れたらやってみよう。
それとサーバ越しの処理も。
技術 iPhone android アプリ開発 物理演算 OpenGLES 3D 自動化 プロジェクト管理 気になる技術、トレンドを書き連ねるところ。
2008年11月26日水曜日
2008年11月23日日曜日
Xcodeのインクリメンタルサーチ
30分ほど、現実逃避に調べモノをしていたら
いろいろ出てくるもんです。ずっとCやらJavaに触れてきた身としては、こんなのがぽこぽこ出てくるXcodeはすてき。
// [myView pointInside:<#(CGPoint)point#> withEvent:<#(UIEvent *)event#>
// [myView touchesBegan:<#(NSSet *)touches#> withEvent:<#(UIEvent *)event#>
// [myView layer
// [myView bounds
// [myView frame
// [myView setTag:<#(NSInteger)#>
// [myView viewWithTag:<#(NSInteger)tag#>
// [myView center
// [myView zone
// [myView sizeToFit
// [myView subviews
// [myView superview
// [myView mutableCopy
// [myView contentMode
いろいろ出てくるもんです。ずっとCやらJavaに触れてきた身としては、こんなのがぽこぽこ出てくるXcodeはすてき。
// [myView pointInside:<#(CGPoint)point#> withEvent:<#(UIEvent *)event#>
// [myView touchesBegan:<#(NSSet *)touches#> withEvent:<#(UIEvent *)event#>
// [myView layer
// [myView bounds
// [myView frame
// [myView setTag:<#(NSInteger)#>
// [myView viewWithTag:<#(NSInteger)tag#>
// [myView center
// [myView zone
// [myView sizeToFit
// [myView subviews
// [myView superview
// [myView mutableCopy
// [myView contentMode
2008年11月8日土曜日
はじめてのmySql
自分一人ではDB、mySqlについてなんにもわからないプログラマが通りますよ。
目的:DBを立ち上げ、アプリ/Webから読み込み、書き出し。要はサーバ構築。
mySqlはこっからダウンロード
http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-5.0.51b-osx10.5-x86_64.dmg/from/pick
ここを見てインストール
http://earlybirds.ddo.jp/namahage/inegalog/article.php?id=8
次に、ターミナルからログイン
(マシン):bin (ユーザ)$ /usr/local/mysql/bin/mysql -u root -p
パスワードを入れて、エントリー。
その他のエントリー方として、
/usr/local/mysql/bin/mysql test
なんてのもある。これだと、データベースを名指しでエントリー。そのDB以外には,許可されたものしか見えなくなる。このときはどんなユーザで入ってるんだろう?ちょっとわからん。
DBを作るコマンドは、create database $データベースネーム;
作ったデータベースを見るには、show databases;
セミコロンは必要なのか?→必要でした。反応しないだけじゃなく、それまで連続行として判定される。
grant select,insert,delete,update,create,drop,file,alter,index on *.* to $ユーザ名 identified by '$パス';
ユーザー $ユーザ名を、パスワード $パスで作る。
flush privileges;
内部キャッシュを消去、privilegesは権限オプション
use データベース名;でデータベースをチェンジして使う。
mysql> create table testtable(
-> text1 text,
-> text2 text not null
-> );
テーブルを内容付けて制作。
show fields from testtable;
作ったテーブルを表示する。
insert into testtable (text1,text2) values('name2','value2');
こんな風にテーブルにデータを入れる。
select text1,text2 pref from testtable;
セレクトでフィールドを指定して、もっと限定してみれる。非限定ならば*。
+-------+--------+
| text1 | pref |
+-------+--------+
| name | value |
+-------+--------+
こんな感じ。さらに限定すると、
select text2 pref from testtable;
+--------+
| pref |
+--------+
| value |
+--------+
select * from testtable where text1='検索内容' ;
選択テーブル内で、text1が検索内容と一致するものを表示する。
select text2 from testtable where text1 = '';
text1が空っぽのtext2を表示する。
select count(*) from testtable;
そのテーブルへの登録数を出す。*は別の項目に入れ替え可能、つまり
select count(text2) from testtable where text1 = '';
こんな事をすると、testtable内でtext1が空っぽであるtext2の数を表示できる。
create index testindex on testtable(text1(4));
testindexというインデックスを、testtableのtext1から、それが文字なので4文字という制限付きで作る。
drop
help;でいくつかのコマンド説明が出る。 ここでは割愛
次は、アプリやWebから読み出す仕掛けを作りたいですね。
目的:DBを立ち上げ、アプリ/Webから読み込み、書き出し。要はサーバ構築。
mySqlはこっからダウンロード
http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-5.0.51b-osx10.5-x86_64.dmg/from/pick
ここを見てインストール
http://earlybirds.ddo.jp/namahage/inegalog/article.php?id=8
次に、ターミナルからログイン
(マシン):bin (ユーザ)$ /usr/local/mysql/bin/mysql -u root -p
パスワードを入れて、エントリー。
その他のエントリー方として、
/usr/local/mysql/bin/mysql test
なんてのもある。これだと、データベースを名指しでエントリー。そのDB以外には,許可されたものしか見えなくなる。このときはどんなユーザで入ってるんだろう?ちょっとわからん。
DBを作るコマンドは、create database $データベースネーム;
作ったデータベースを見るには、show databases;
セミコロンは必要なのか?→必要でした。反応しないだけじゃなく、それまで連続行として判定される。
grant select,insert,delete,update,create,drop,file,alter,index on *.* to $ユーザ名 identified by '$パス';
ユーザー $ユーザ名を、パスワード $パスで作る。
flush privileges;
内部キャッシュを消去、privilegesは権限オプション
use データベース名;でデータベースをチェンジして使う。
mysql> create table testtable(
-> text1 text,
-> text2 text not null
-> );
テーブルを内容付けて制作。
show fields from testtable;
作ったテーブルを表示する。
insert into testtable (text1,text2) values('name2','value2');
こんな風にテーブルにデータを入れる。
select text1,text2 pref from testtable;
セレクトでフィールドを指定して、もっと限定してみれる。非限定ならば*。
+-------+--------+
| text1 | pref |
+-------+--------+
| name | value |
+-------+--------+
こんな感じ。さらに限定すると、
select text2 pref from testtable;
+--------+
| pref |
+--------+
| value |
+--------+
select * from testtable where text1='検索内容' ;
選択テーブル内で、text1が検索内容と一致するものを表示する。
select text2 from testtable where text1 = '';
text1が空っぽのtext2を表示する。
select count(*) from testtable;
そのテーブルへの登録数を出す。*は別の項目に入れ替え可能、つまり
select count(text2) from testtable where text1 = '';
こんな事をすると、testtable内でtext1が空っぽであるtext2の数を表示できる。
create index testindex on testtable(text1(4));
testindexというインデックスを、testtableのtext1から、それが文字なので4文字という制限付きで作る。
drop
help;でいくつかのコマンド説明が出る。 ここでは割愛
次は、アプリやWebから読み出す仕掛けを作りたいですね。
subversion on iDisk でのプロジェクト管理
防忘録として。
様々な場所からファイルにアクセスしたいため、subversion on iDiskにチャレンジ。
先に、iDisk>環境設定からローカルディスクへのコピー をオンにしておく。
ローカルファイルにアクセスする扱いになるので、subversion設定とHDバックアップが自動になりとても楽!
subversionのバージョンは、インストールして1.5にしておく。
インストーラがusr/loca/binに1.5を入れるので、usr/binに1.4がはいっている場合は、usr/bin下のsunversion 1.4周りを消すしか無いのかな。 mac買った時期によっては入ってるはず。
プロジェクト名:$PROJCET
リポジトリ名:$REPOS
チェックアウトする作業場所:$WORKING_SPACE
cd /Volumes/$DISKNAME
mkdir $REPOS
svnadmin create $REPOS --fs-type fsfs
//一時的にディスク上に構成を作るため、空のプロジェクトファイルを設定。
cd ~/
mkdir tmp
cd tmp
mkdir $PROJECT
cd $PROJECT
mkdir trunk branches tags
cd ..
//iDiskにインポートする。
svn import ./ file:///Volumes/$DISKNAME/repos -m "initiali report"
//プロジェクトファイルを保存する予定の、$WORKSPACEを用意。
cd ~/
mkdir $WORKSPACE
cd $WORKSPACE
svn checkout file:///Volumes/$DISKNAME/$REPOS/$PROJECT/trunk .
//プロジェクト一式を$WORKSPACEにコピーしておく。
svn add --force $PROJECT
//コミット。
svn commit -m "メッセージ"
ここまでで、iDisk上でrepositoryが使えるようになる。
で、あとはXcode上でのプロジェクト設定なのだが、
いまだ悩み中。。。
初期目的は達成したのでここまで。
様々な場所からファイルにアクセスしたいため、subversion on iDiskにチャレンジ。
先に、iDisk>環境設定からローカルディスクへのコピー をオンにしておく。
ローカルファイルにアクセスする扱いになるので、subversion設定とHDバックアップが自動になりとても楽!
subversionのバージョンは、インストールして1.5にしておく。
インストーラがusr/loca/binに1.5を入れるので、usr/binに1.4がはいっている場合は、usr/bin下のsunversion 1.4周りを消すしか無いのかな。 mac買った時期によっては入ってるはず。
プロジェクト名:$PROJCET
リポジトリ名:$REPOS
チェックアウトする作業場所:$WORKING_SPACE
cd /Volumes/$DISKNAME
mkdir $REPOS
svnadmin create $REPOS --fs-type fsfs
//一時的にディスク上に構成を作るため、空のプロジェクトファイルを設定。
cd ~/
mkdir tmp
cd tmp
mkdir $PROJECT
cd $PROJECT
mkdir trunk branches tags
cd ..
//iDiskにインポートする。
svn import ./ file:///Volumes/$DISKNAME/repos -m "initiali report"
//プロジェクトファイルを保存する予定の、$WORKSPACEを用意。
cd ~/
mkdir $WORKSPACE
cd $WORKSPACE
svn checkout file:///Volumes/$DISKNAME/$REPOS/$PROJECT/trunk .
//プロジェクト一式を$WORKSPACEにコピーしておく。
svn add --force $PROJECT
//コミット。
svn commit -m "メッセージ"
ここまでで、iDisk上でrepositoryが使えるようになる。
で、あとはXcode上でのプロジェクト設定なのだが、
いまだ悩み中。。。
初期目的は達成したのでここまで。
2008年11月5日水曜日
登録:
投稿 (Atom)