Edited at
UnityDay 4

Unityで柳沢PIC形式の画像を読込む

More than 3 years have passed since last update.

Unity でテクスチャ画像を取り込みたい時、PSD, TIFF, JPG, TGA, PNG, GIF, BMP, IFF, PICT などメジャーな画像フォーマットは大抵サポートされています。それらはそのままプロジェクトブラウザにドラッグ&ドロップすれば即座にインポートされるので何の問題もありません。

ところが、あなたがたまたま手にした画像は古い MO から発掘されたもので、Unity にすんなり取り込むことができませんでした。バイナリエディタでファイルの先頭を嘗めてみると、「P」「I」「C」の3文字が…。そこであなたはピンときました。

「ペロッ…これは柳沢PICの味だ!」(<どんな味だ)


柳沢PIC形式とは

1980年代後半~1990年代前半にかけて、主に 16bit のパソコン X68000 シリーズで広く使われていた32768(65536)色の画像ファイル形式です。

その名の通り柳沢明氏が考案し、氏の開発した pic.r を筆頭に多くの互換ツールが開発され、広く使われていました。

横に同じ色が連続する数を記録したランレングス圧縮を拡張し、同じ色の開始座標を縦に連鎖する形で記録、色情報も内部でキャッシュしそのインデックス番号を符号に用いるなどの工夫を行い圧縮率を向上を図っていました。

同じ色が連続し易いアニメ調の画像には高圧縮率を誇り、当時の CPU でも展開速度は十分速かったため広く普及していました。一部の Windows 用の画像ローダーでも対応しています。

pic.r など当時のツールでは展開中に連鎖情報が描画され、稲妻のように見えるのがとても印象的でした。


使い方

先日Unityアセットストアで公開したPLAY Animation Importer for Unityは、DOGA-LシリーズとてかんCGPLAY Animationのパーツアセンブラファイル(*.e1p, *.l3pなど)をUnityに取り込むプラグインですが、実は隠し機能として柳沢 PIC 形式の画像の読み込みに対応しています。

1. ↑のリンクから PLAY Animation Importer for Unity (無料)をダウンロード・インストールして下さい。こちらでも同じものがダウンロードできます。

2. 柳沢PIC形式の画像(拡張子 .pic) をプロジェクトブラウザにドラック&ドロップして下さい。

これで読み込まれた画像がテクスチャになります。

12YanagisawaPicLoader.png

PLAY Animation Importer for Unity本来の機能であるパーツアセンブラの読み込みは製品が登録されていないと使用できませんが、柳沢PICの読み込みは未登録でも使用可能です。


なんでこんなものを作ったか

必要に迫られたからです(泣)。

パーツアセンブラファイルにはパーツ名やテクスチャ名が書かれているだけで実際の頂点やマテリアル・テクスチャのデータは含んでいないため、上記製品のディレクトリから取ってくる必要があります。そして、DOGA-LシリーズとてかんCG、(PLAY Animation に至っては今年発売したものであるにも関わらず)テクスチャ画像の一部に柳沢PIC形式が残っています。(もちろん近年追加されたものを中心にほとんどは PNG・JPEG・BMP です)

そこでローダをC#で実装する羽目になりました。orz (20年以上前のファイルフォーマットを純粋なC#で実装する機会なんてそうないので、作ってるときはとても楽しんでたような気もしますが…)


自分のプログラムで使いたい

インストールされた PLAY Animation Importer のディレクトリにPlayAnimationImporter/Editor/YanagisawaPicLoaderLib.dllがありますので、ご自由にお使い下さい。

Unity の Texture2D に読み込む場合はこんな感じになるかと思います。byte[] を与えて YanagisawaPicLoader を生成し extract() を呼ぶと、width と height に画像の縦横サイズが、bytesImageExtracted に展開後の画像が入ります。

using System.IO;

using UnityEngine;
using YanagisawaPicLoaderLib;

Texture2D loadTexture(string nameAssetFullPath)
{
byte[] bytes = File.ReadAllBytes(nameAssetFullPath);
var loader = new YanagisawaPicLoader(bytes);
loader.extract();

var texture = new Texture2D(loader.width, loader.height, TextureFormat.ARGB32, false, false);
texture.LoadRawTextureData(loader.bytesImageExtracted);
texture.Apply(true, true);

bytes = null;

return texture;
}

Bitmap に読込む際はbyte列の並びとY座標が変わることに注意して下さい。

using System.IO;

using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using YanagisawaPicLoaderLib;

Bitmap loadToBitmap(string nameFile)
{
byte[] bytes = File.ReadAllBytes(nameFile);
var loader = new YanagisawaPicLoader(bytes, YanagisawaPicLoader.PixelOrder.BGRA, YanagisawaPicLoader.DirectionY.TopToBottom);
loader.extract();
var bitmap = new Bitmap(loader.width, loader.height, PixelFormat.Format32bppArgb);
var dataBitmap = bitmap.LockBits(new Rectangle(0, 0, loader.width, loader.height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
Marshal.Copy(loader.bytesImageExtracted, 0, dataBitmap.Scan0, loader.bytesImageExtracted.Length);
bitmap.UnlockBits(dataBitmap);

return bitmap;
}


注意事項

PLAY Animation Importer に含まれる YanagisawaPicLoaderLib.dll は、DOGA-Lシリーズ・とてかんCG・PLAY Animation Importer に含まれる柳沢PIC形式画像を読む事を目的に開発しましたので、32768色・65536色の柳沢PIC形式しか対応していません。特に拡張 PIC フォーマットには全く対応していませんのでご注意下さい。(対応の予定もありません)

読めないものがありましたら support@doga.jp までお知らせ頂けましたら嬉しいです。ただ迅速な対応ができるとは限りませんので、ご了承下さい。


謝辞

柳沢PIC画像ローダの開発には以下の資料を参考にさせて頂きました。この場を借りて深く感謝申し上げます。(o)

- やなぎさわさんのPIC_FMT(PICフォーマット仕様書・サンプルソースコード)

- GORRYさんの APICG ソースコード

当時仕様書やソースコードを公開して下さったおかげで、こうして2014年の今になってもローダを書くことができました。ありがたやありがたや…。

次は SatoruNoda さんの「Unityアセットサーバーを使ってグループ開発の作業効率を上げよう。」です。