photoshopのスウォッチ(.aco)を色相で並び替えるようにしたい

  • このエントリーをはてなブックマークに追加
  • LINEで送る

20091227|とりあえずのが出来たのでアップしまんた。
暫定版 photoshopのスウォッチ(.aco)を色相で並び替えるようにした
————————-

何をどうしたらそんな事が出来るようになるのかわからんので、やってる事がずれてるかもしれんけどもメモ。

.acoの中身を見たい、
バイナリエディタで見るしかないようだ。
Stirlingを使ってみる。

16進数?なにそれ、まいったな。

適当なスウォッチを何個か作って.acoで書き出して、見比べてみて判ったこと

#508b94 を2個登録したスウォッチをバイナリエディタで開くと以下の通り
[text]
00 01 00 02 00 00 50 50 8B 8B 94 93 00 00 00 00
50 50 8B 8B 94 93 00 00 00 02 00 02 00 00 50 50
8B 8B 94 93 00 00 00 00 00 08 30 B9 30 A6 30 A9
30 C3 30 C1 00 20 00 31 00 00 00 00 50 50 8B 8B
94 93 00 00 00 00 00 08 30 B9 30 A6 30 A9 30 C3
30 C1 00 20 00 32 00 00
[/text]

2色目を#945066に変更したスウォッチは以下
[text]
00 01 00 02 00 00 50 50 8B 8B 94 93 00 00 00 00
94 93 50 50 66 66 00 00 00 02 00 02 00 00 50 50
8B 8B 94 93 00 00 00 00 00 08 30 B9 30 A6 30 A9
30 C3 30 C1 00 20 00 31 00 00 00 00 94 93 50 50
66 66 00 00 00 00 00 08 30 B9 30 A6 30 A9 30 C3
30 C1 00 20 00 32 00 00
[/text]

最初の00 01と最後の00 00は定型ぽい
次の00 02が登録されてる色の数、
3つ登録してあるスウォッチは00 03で、58個登録されてるスウォッチは00 3Aだった。
(2進数、8進数、10進数、16進数相互変換で変換させてもらってます。)

次の00 00がよく分からないけど区切り?
その後の50 50 8B 8B 94 93がhex値、前半2桁だけが有効?で00 00で閉じる?

[text]00 08 30 B9 30 A6 30 A9 30 C3 30 C1 00 20 00[/text]も区切りかな

hex値ぽいところを以下のようにガーっと00にしてもちゃんと読み込む
[text]
00 01 00 02 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 02 00 02 00 00 50 50
8B 8B 94 93 00 00 00 00 00 08 30 B9 30 A6 30 A9
30 C3 30 C1 00 20 00 31 00 00 00 00 94 93 50 50
66 66 00 00 00 00 00 08 30 B9 30 A6 30 A9 30 C3
30 C1 00 20 00 32 00 00
[/text]
02 00 02 00からが本当の色設定?

phpのテスト

[html]
<!– rgb.html –>
<form id="form1" name="form1" method="post" action="rgb.php">
<ul><li><label for="rr">r</label>:<input type="text" name="rr" id="rr" max="3" /></li>
<li><label for="gg">g</label>:<input type="text" name="gg" id="gg" max="3" /></li>
<li><label for="bb">b</label>:<input type="text" name="bb" id="bb" max="3" /></li></ul>
<input type="submit" />
</form>
[/html]
[php]
// rgb.php
$r=hexdec($_POST["rr"]);
$g=hexdec($_POST["gg"]);
$b=hexdec($_POST["bb"]);
//
$max=max($r,$g,$b);
$min=min($r,$g,$b);
print "max:".$max."<Br>";
print "min:".$min."<Br>";
print $_POST["rr"]."<Br>";
print $_POST["gg"]."<Br>";
print $_POST["bb"]."<Br>";

if($max==$min){
$hue=0;
}
else if($g==$max) {
$hue=($b-$r)/($max-$min)*60+120;
}
else if($b==$max) {
$hue=($r-$g)/($max-$min)*60+240;
}
else if($g<$b){
$hue=($g-$b)/($max-$min)*60+360;
}
else{
$hue=($g-$b)/($max-$min)*60;
}
print "hue値".$hue;
[/php]

でhexからhueを取り出せた。

あと必要な事

.acoの色の格納のされ方と範囲指定しての取り出し方
phpでバイナリを読む方法
とか?
方向はあってるんのでしょうか…

とりあえずphpで読み込んでみた

辞書を引きながら、こんな感じに。
[php]$fname="945066.aco";
$aco=fopen($fname,"rb");
$str=fread($aco,filesize($fname));
$str=bin2hex($str);
echo $str;

$aco_ar=explode(‘0000’,$str);
print_r($aco_ar);

fclose($aco);
[/php]
出力結果
[text]
00010002000050508b8b949300000000949350506666000000020002000050508b8b949300000000000830b930a630a930c330c1002000310000000094935050666600000000000830b930a630a930c330c1002000320000Array
(
[0] => 00010002
[1] => 50508b8b9493
[2] =>
[3] => 949350506666
[4] => 00020002
[5] => 50508b8b9493
[6] =>
[7] => 000830b930a630a930c330c100200031
[8] =>
[9] => 949350506666
[10] =>
[11] => 000830b930a630a930c330c100200032
[12] =>
)
[/text]

メモ
explode(‘区切り文字’,文字列);
explode(‘0000’,$str);

0000で区切ったけど、これだと#000が登場した時に区切り文字になってしまう。

メモ2
どうゆう風にしてけばいいんだろ
最初の2バイトを飛ばして、次の2バイトに格納されてる色の数を取得
前半00 00 RR RR GG GG BB BB 00 00で1セット
RR RRなどそれぞれの後半2文字を飛ばす
000830b930a630a930c330c1002000の前に出てくるRRRR GGGG BBBBを書き換える

  • このエントリーをはてなブックマークに追加
  • LINEで送る

SNSでもご購読できます。

コメント

コメントを残す


You can add images to your comment by clicking here.