仕様書は公開されているので仕様書通りにバイナリ(アイコンファイル)を出力すればよいのでは?
…ということで作ってみた。これを実行ファイルにして投稿すれば今年も参加賞は頂きだっ!
// 実行時にicon.iconと128.png,64.png,48,png,32.png,16.pngファイルは
// 上書きされるので注意すること
// 仕様書https://ja.wikipedia.org/wiki/ICO_(%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88)
#include "hspcv.as"
#define NUM 5
SIZE = 128, 64, 48, 32, 16
// アイコンの元となる画像の作成
alloc m_nIcon, 10240000;
sdim m_nData, 10240000, NUM;
dim m_nByte, NUM;
// 128x128以上の画像を読み込むこと
dialog "png|jpg", 16
if (stat == 0) {
end
}
fname = refstr;
cvload fname, 1
repeat NUM
cvcopy 0, 0, 0, 1
cvresize SIZE(cnt), SIZE(cnt), 1, CV_INTER_AREA
cvsave "" + SIZE(cnt) + ".png", 1
loop
// アイコンの作成
// アイコンデータ読み込み
repeat NUM
bload "" + SIZE(cnt) + ".png", m_nData(cnt)
m_nByte(cnt) = strsize;
loop
// ヘッダ 6byte
wpoke m_nIcon, 0, 0;
wpoke m_nIcon, 2, 1; // タイプ 1:ico 2:cur
wpoke m_nIcon, 4, 5; // 個数 128, 64, 48, 32, 16
// ディレクトリ 16byte x NUM
off = 6;
gdp = 6 + (16 * NUM);
repeat NUM
poke m_nIcon, off + 0, SIZE(cnt); // 幅
poke m_nIcon, off + 1, SIZE(cnt); // 高さ
poke m_nIcon, off + 2, 0; // パレット色数
poke m_nIcon, off + 3, 0; //
wpoke m_nIcon, off + 4, 0; // カラープレーン数
wpoke m_nIcon, off + 6, 0; // ピクセル毎のビット数
lpoke m_nIcon, off + 8, m_nByte(cnt); // 画像データのバイト数
lpoke m_nIcon, off + 12, gdp; // 画像データの位置
off += 16;
gdp += m_nByte(cnt);
loop
// アイコンデータ
repeat NUM
i = cnt;
repeat m_nByte(i)
n = peek(m_nData(i), cnt);
poke m_nIcon, off, n;
off++;
loop
loop
bsave "icon.ico", m_nIcon, gdp;
dialog "アイコンデータを出力しました"