初投稿です。結構雑なメモですが需要があれば。
経緯と注意点
筆者はクリスタユーザーで、カラーセット(Photoshopのカラースウォッチのようなもの)を色々カスタマイズしようとしていたのですが、クリスタのカラーセットファイル(.cls)の仕様がわからなかったので、Photoshopスウォッチファイル形式(.aco)で入出力を行うことにしました。
その際、仕様書(英語)を読んだり、VSCodeでバイナリファイルを見たりして分かったことをまとめたものがこちらです。
つまり、クリスタから書き出されたacoファイルしか見ていないので、Photoshopで書き出したものとは異なる点があるかもしれないです。そこだけご注意を!
全体の構造
長さ(byte) | 項目 | 値 | エディタ上(例) |
---|---|---|---|
2 | バージョン(1) | 1に固定 | 00 01 |
2 | ファイル内の色の数n | 範囲は不明* | 00 80 |
n×10 | 色データ | 下の表参照 | 略 |
2 | バージョン(2) | 2に固定 | 00 02 |
2 | ファイル内の色の数n | 範囲は不明* | 00 80 |
n×(10+任意) | 色データ+色名(Unicode文字列**) | 下の表参照 | 略 |
*実験してません。0色でクリスタから出力しようとしたらできませんって言われちゃった | |||
**クリスタのカラーセットでは色名を付けられないので、ここがどうなってるのかは詳しくわかりませんでした。 | |||
仕様書曰く | |||
"UTF-16のユニット数(=文字数+終端文字1ユニット分?)を表す4byte+文字数×2byte+終端文字2byte" | |||
になるらしいです。実際、クリスタからの出力ファイルだと、この部分は全部の色で |
00 00 00 01 00 00
// 前半4byteはユニット数(=1)、後半2byteは終端文字
になっていて、仕様に即しているのがわかります。
色データ
長さ(byte) | 項目 | 値 | エディタ上(例) |
---|---|---|---|
2 | 色の表現形式(IDで指定) | 0 | 1 |
8 | 上の表現形式で表現された各色のデータ。 8byteすべてに値が入らないときは、残りの値は定義されず0になる。 |
IDによる | FF FF FF FF FF FF 00 00 (RGB(255,255,255)の真っ白) |
表現形式ID
ID | 形式 | 色データパラメータ | エディタ上(例) |
---|---|---|---|
0 | RGB (Red, Green, Blue, 00 00) すべてunsigned 16-bit |
それぞれ[0,65535] | 00 00 FC FC ED ED D5 D5 00 00 |
1 | HSB (hue, saturation, brightness, 00 00) すべてunsigned 16-bit |
それぞれ[0,65535] | |
2 | CMYK (cyan, magenta, yellow, black) すべてunsigned 16-bit |
それぞれ[0,65535] | |
7 | Lab (lightness, a chrominance, b chrominance, 00 00) すべて16-bit |
[0,10000],[-12800,12700],[-12800,12700] | |
8 | Grayscale (grayscale, 残り全部00) その名の通りグレースケール |
[0,10000] |
- 他にもIDと形式は存在するが、詳細はあまり公開されていない。(仕様書にちょっと書いてあります)
- クリスタではバージョン1と2ともにRGB形式で書き出されるみたいです。
- Photoshopではどうなのかわかりませんが、普通は色のパラメータって8bitの範囲[0,255]で扱うのでなんらかの変換が必要かも(クリスタの出力では8bitの値が2回繰り返されている)
そのほか
- クリスタ→ACO形式だと透明色はRGB(0,0,0)の値になるっぽい?→読み込んでみたら透明色は全部黒になってました
- クリスタはバージョン2のほうのみを読んでるっぽい(バイナリファイルをバージョン2のほうだけ変えたらバージョン2に即した色になった)
- RGBの各2byteの値は1byteの0~255の繰り返しだが、どちらも同じ値じゃないと読み込んだ時おかしくなったのでちゃんと繰り返して書いておく必要がありそう。
- 16進数カラーコードとカラーセットファイルの変換ツールとかはすぐ作れそうですね
参考
ここに書いてある半分は仕様書の一部を訳したものなので、こちらも見てみてください!