2011年02月05日のツイート

ちょっとこれは意味わかんない

検索エンジンさんマジパねーっす。
Yahooから「ジェフをビートマップに変換」でこのブログにたどり着いた人がいる。誰だよジェフって。
「もしかして」も「ジェフ ビットマップに変換」ではありませんか?とこれまた意味不明。なんでそこまでジェフにこだわる。
やっぱりこれ、「GIFをBMPに変換」と言いたかったんだろうか。わからんわー。

スプライト操作DLLマニュアル

DLL本体はこれ。

スプライトの基礎

スプライト操作DLLでは、lsp(or lsph)で作成したスプライトを操作するができます。
その際、スプライトのどの部分を操作するか、指定の方法が少々特殊です。

たとえば、このような画像があったとして、それを読み込みます。恐らく、このようにしなければまともには表示されないはずです。

lsp 200,":a/3,0,3;image.bmp",0,0 ; 右側にマスク画像あり(:a)で3セル。

スプライト操作DLLでは、常にどのスプライトを対象とするか、スプライト番号だけでなくセル番号とマスク番号まで指定するようにします。
書式にすると

(スプライト番号),(セル番号),(マスク番号)

となります。
たとえば、「200,0,1」とした場合は「200番のスプライトの、0番目(一番左)のセルの、マスク画像部分」を意味します。

exec_dll "sp.dll/mirror,200,0,0" ; 左右反転コマンド。200番のスプライトの0番目のセルの実体部分が対象。
exec_dll "sp.dll/mirror,200,0,1" ; 左右反転コマンド。200番のスプライトの0番目のセルのマスク画像部分が対象。
; ここまでしないと、恐らく意図したとおりに「左右反転」はできない。

このようにコマンドによっては、事実上2回の指定が必要な場合もあります。
※実体部分とマスク画像部分を別々に扱うようにしたのは、それが必要な場面も存在するからです。

コマンドの基礎

スプライト操作DLLの命令の与え方は、基本的に以下のようになっています。

exec_dll "sp.dll/(コマンド),(スプライト番号),(セル番号),(マスク番号)"

その他必要な引数があれば、後に続けるようになっています。
以下、それぞれのコマンドについて。

命令リスト

getpixel
ドットの色と不透明度を取得
line/polyline
直線描画/多角形描画
paint
境界色指定塗りつぶし。
mirror/vmirror
鏡面/天地鏡面
negative/monocrome/grayscale
ネガ/モノクロ/グレースケール
mozaic
モザイク
fill/gradation/vgradation
フィル/グラデーション/上下グラデーション
smooth
なめらかにする。
shade/burst
陰化/侵食
copy
全コピー
rotate
回転
crop/patch
切り取り/貼りつけ
expand
拡大縮小
write
文字を書きこむ。
save
スプライトを外部に保存。

mirror/vmirror

左右反転、上下反転のコマンド。

; 0番のセルを左右反転
exec_dll "sp.dll/mirror,200,0,0"
exec_dll "sp.dll/mirror,200,0,1"
; 1番のセルを上下反転
exec_dll "sp.dll/vmirror,200,1,0"
exec_dll "sp.dll/vmirror,200,1,1"

実行例

応用例

当然ながら、左右反転と上下反転を両方をすると、180度回転と同じ効果が得られます。

negative/monocrome/grayscale

ネガ、モノクロ、グレースケールのコマンド。
モノクロとグレースケールの違いは、計算式の違い。グレースケールの方が一般的には「自然」とされる計算式を使っています。
これら色変えのコマンドは、通常マスク画像部分を処理する必要がありません。

exec_dll "sp.dll/negative,200,0,0" ; ネガティブ
exec_dll "sp.dll/monocrome,200,1,0" ; モノクロ
exec_dll "sp.dll/grayscale,200,2,0" ; グレースケール

実行例

応用例

マスク画像部分をネガティブ反転させて、実体部分を適当な背景画にして表示すると、「人の形に背景が切り抜かれている」ようにできます。

mozaic

モザイクのコマンド。
モザイクのコマンドには、さらに6つの引数が必要です。モザイクをかけたい領域の左上と右下のx座標とy座標、それにモザイクの大きさ(幅と高さ)です。

exec_dll "sp.dll/mozaic,200,0,0,130,90,240,130,4,8"
; スプライト番号200、セル番号0、マスク番号0(実体部分)の
; (130,90)-(240,130)の領域にモザイクをかける。
; モザイク一つの大きさは幅4ドット、高さ8ドット
実行例

応用例

モザイクの大きさのどちらかに1を指定し、もう一つを極端に大きくしてみます。

exec_dll "sp.dll/mozaic,200,0,0,0,0,415,160,1,16"


なんだかさらにみのもんたの相談者みたいになりました。

fill/gradation/vgradation

単色塗り潰し、グラデーション塗り潰し横と縦のコマンドです。
単色塗り潰し(fill)は、さらに色を指定する三つ引数が必要です。
グラデーション二つは、色を指定する三つの引数がさらにもう一つ必要です。
単色塗り潰しの場合、指定されたセル部分をその色で塗り潰します。
グラデーション(横)は、一番左に指定された最初の色、一番右に指定された後の色、その間を中間色で埋めます。
グラデーション(縦)は、上から下に向かう以外はグラデーション(横)と変わりません。

exec_dll "sp.dll/fill,200,0,0,255,0,0"
exec_dll "sp.dll/gradation,200,1,0,255,255,255,0,0,0"
exec_dll "sp.dll/vgradation,200,2,0,255,0,255,0,255,0"

実行例

元画像 fill/単色塗り潰し gradation/横グラデ vgradation/縦グラデ

応用例

立ち絵を加工するよりも、グラデーションのできる塗り潰し長方形と考えた方がよいかも知れません。

smooth

ぼかしフィルターのコマンド。
すりガラスで透かしたような画像を作成します。
このコマンドは、元になる画像と処理された画像が別々になります。

lsph 200,":a;image.bmp",0,0
lsp 201,":a;image.bmp",0,0
exec_dll "sp.dll/smooth,200,0,0,201,0,0,5,5"
; スプライト番号200・セル番号0の実体部分を、
; スプライト番号201・セル番号0の実体部分に、
; ぼかし処理をしてからコピーします。
; 最後二つの5,5は、それぞれ横方向と縦方向のぼかしの強さです。1だとただのコピーになります。2以上の数値を指定してください。

実行例

加工前画像 加工後画像 使用例

ピンボケ写真風演出に使えますね。無論、背景をボケさせても構わないのでしょうが。
一部分だけボケさせたい時は、後述のcropなどで切りだして、ぼかしを入れて、それを貼るなりするのがよいでしょう。

copy

スプライトの実体部分かマスク部分を選んで、それを別のスプライトにそのまま貼り付ける命令。
これも二つのスプライトを使用します。

exec_dll "sp.dll/copy,200,0,0,201,0,0"
; スプライト番号200・セル番号0の実体部分を、
; スプライト番号201・セル番号0の実体部分に、
; そのまま貼り付ける。

なお、位置や大きさの指定はありません。
もし、二つのスプライトの大きさが違った場合、この命令はできるだけのことをします。
元>先だった場合は、はみ出た分は無視されます。逆に元<先だった場合は、先の部分に元画像が残る部分が出てきます。
拡大縮小がしたい場合は、後述のexpandを使用します。

rotate

回転コピーコマンドです。
コピー元からコピー先へ、90度回転させてからコピーします。

lsp 200,":a;image.bmp",0,0 ; 大きさを、415*480とする。
lsp 201,":a;>960,415,#FFFFFF",0,0 ; 480*415の画像を作成する。ただし、アルファブレンドにするならば、さらに幅を倍にする。
; 書式 (コピー元のスプライト指定),(コピー先のスプライト指定),(回転方向)
; 回転方向は1で時計回り、-1で反時計回り
exec_dll "sp.dll/rotate,200,0,0,201,0,0,1"
exec_dll "sp.dll/rotate,200,0,1,201,0,1,1"
; 実体部とマスク部の両方をしないと意味がない。

予め、コピー先の大きさはコピー元の大きさをタテヨコを入れ替えたものを、塗り潰し長方形などを使って作ってください。

実行例

200 201

無事に横になりましたが、さて。

応用例

あまり使い道のない効果かと思います。ノベルの立ち絵などよりも、アクションなどで必要になるかと。

crop/patch

切り出し命令
あるスプライトの一部を指定し、その部分を別のスプライトに貼り付ける命令です。

lsp 200,":a;image.bmp",0,0
lsp 201,":a;>560,140,#FFFFFF",0,0
; (コピー元スプライト番号),(セル番号),(マスク番号),(コピー開始x),(コピー開始y),(コピー先スプライト番号),(セル番号),(マスク番号)
exec_dll "sp.dll/crop,200,0,0,70,40,201,0,0"
exec_dll "sp.dll/crop,200,0,1,70,40,201,0,1"
; 実体部分とマスク部分の両方をコピーする。

コピー元画像の指定した座標から、コピー先がいっぱいになるまでをコピーします。

実行例

200 201

顔グラフィックができました。

応用例

部分的な加工を実現するための基本になる命令です。
加工したい部分をこれで切りだしておいて、それを様々に加工後、元の画像に重ね合わせるなどします。

patch

貼りつけ命令
cropと対になることを想定して作られた命令です。
cropと同じ書式で、コピー先とコピー元を入れ替えた動作をします。
つまり、

  • cropで切り出す。
  • 切り出したスプライトを色々加工する。
  • patchで戻す。(cropの時と同じパラメータを与える)

このように処理できます。

expand

拡大縮小コピーのコマンド

lsp 200,":a;image.bmp",0,0
lsp 201,":a;>560,640,#FFFFFF",0,0
; (コピー元スプライト番号),(セル番号),(マスク番号),(コピー先スプライト番号),(セル番号),(マスク番号)
exec_dll "sp.dll/expand,200,0,0,201,0,0"
exec_dll "sp.dll/expand,200,0,1,201,0,1"
; 実体部分とマスク部分の両方を拡大縮小コピーする。

コピー元画像全体を、コピー先画像の大きさに合わせて拡大縮小してコピーします。
速度よりも滑らかさを重視した(結果が出ているかどうかはさておき)アルゴリズムを採用しています。
※結果、非常に処理が重くなりましたので、多用は禁物です。

実行例

200 201

write

文字を書きこむコマンドです。引数が多く、またスプライトの指定も通常から外れていますので、ずれないように注意してください。
※横書き専用です。

exec_dll "sp.dll/write,200,0,0,0,HGP創英角ポップ体,24,48,0,255,0,0,255,右代宮戦人"
; 200, 0 : スプライト番号200のセル番号0を書き込み対象とします。※マスク指定はありません。注意。
; 0, 0 : 書き込みの左上位置を指定します。
; HGP創英角ポップ体, フォント名を指定します。必ず指定して、間違えないようにしてください。
; 24, 48, 0 : フォントのサイズです。横幅、高さ、文字間の指定です。横幅は高さの半分が基本です。英文指定です。
; 255, 0, 0 : フォントの色です。この場合真っ赤を指定しています。
; 255 : 文字のアルファブレンドです。255にすると不透明です。
; 右代宮戦人 : 表示する内容です。

書込み先のスプライトがコピーかアルファブレンドかは自動で判別します。
文字列が長く、表示するとスプライトからはみ出てしまう場合は、そこで書き込みをやめるようになっています。
また、これにはgetretによる返り値があります。

getret $0 ; 与えられた文字列のうち、書き込みできなかった分の文字列が戻ってきます。
getret %0 ; 書き込んだ文字列領域の右端のx座標が戻ってきます。

$0に何か入っていれば、書き込みができなかったことがわかります。
%0を見れば、次はどこから書きこめばよいかの指針になります。

実行例

形式 加工前 加工後
:a;に書き込んだ場合
:c;に書き込んだ場合

応用例

フォントに「@」で始まる縦書き用フォントを指定して作成します。
それを時計回りrotateさせます。

縦書きフォント rotate
lsp 200,":a;>800,24,#FFFFFF",0,0
lsp 201,":a;>48,400,#FFFFFF",0,0
exec_dll "sp.dll/write,200,0,0,0,@HGP創英角ポップ体,12,24,0,255,0,0,255,右代宮戦人"
exec_dll "sp.dll/rotate,200,0,0,201,0,0,1"
exec_dll "sp.dll/rotate,200,0,1,201,0,1,1"

一応これで、縦書きも可能になります。

save

保存の命令です。
指定されたスプライトの画像を、bmp形式で外部ファイルに出力します。
書式的にはスプライト番号の指定だけが必要です。

exec_dll "sp.dll/save,200" ; 200番のスプライトを、"200.bmp"の名前で保存する。(指定しなければこうなる。)
exec_dll "sp.dll/save,201,tumbnail.bmp" ; 200番のスプライトを、"thumbnail.bmp"の名前で保存する。

当然ながら、保存された画像は別の命令で読み込むことが可能です。
また、getretによる返り値が取得できます。

getret $0 ; 保存するのに使ったファイル名が取得できます。

ファイル名を指定せずに保存した時、自動で与えられるファイル名がこれで取得できますので、そのままlsp2や他の命令に渡すことができます。

応用例

加工して保存した後、その画像をlsp2で読みこめば、間接的にlsp2を加工できることになります。

スプライト操作DLLマニュアル

DLL本体はこれ。

スプライトの基礎

スプライト操作DLLでは、lsp(or lsph)で作成したスプライトを操作するができます。
その際、スプライトのどの部分を操作するか、指定の方法が少々特殊です。

たとえば、このような画像があったとして、それを読み込みます。恐らく、このようにしなければまともには表示されないはずです。

lsp 200,":a/3,0,3;image.bmp",0,0 ; 右側にマスク画像あり(:a)で3セル。

スプライト操作DLLでは、常にどのスプライトを対象とするか、スプライト番号だけでなくセル番号とマスク番号まで指定するようにします。
書式にすると

(スプライト番号),(セル番号),(マスク番号)

となります。
たとえば、「200,0,1」とした場合は「200番のスプライトの、0番目(一番左)のセルの、マスク画像部分」を意味します。

exec_dll "sp.dll/mirror,200,0,0" ; 左右反転コマンド。200番のスプライトの0番目のセルの実体部分が対象。
exec_dll "sp.dll/mirror,200,0,1" ; 左右反転コマンド。200番のスプライトの0番目のセルのマスク画像部分が対象。
; ここまでしないと、恐らく意図したとおりに「左右反転」はできない。

このようにコマンドによっては、事実上2回の指定が必要な場合もあります。
※実体部分とマスク画像部分を別々に扱うようにしたのは、それが必要な場面も存在するからです。

コマンドの基礎

スプライト操作DLLの命令の与え方は、基本的に以下のようになっています。

exec_dll "sp.dll/(コマンド),(スプライト番号),(セル番号),(マスク番号)"

その他必要な引数があれば、後に続けるようになっています。
以下、それぞれのコマンドについて。

命令リスト

getpixel
ドットの色と不透明度を取得
line/polyline
直線描画/多角形描画
paint
境界色指定塗りつぶし。
mirror/vmirror
鏡面/天地鏡面
negative/monocrome/grayscale
ネガ/モノクロ/グレースケール
mozaic
モザイク
fill/gradation/vgradation
フィル/グラデーション/上下グラデーション
smooth
なめらかにする。
shade/burst
陰化/侵食
copy
全コピー
rotate
回転
crop/patch
切り取り/貼りつけ
expand
拡大縮小
write
文字を書きこむ。
save
スプライトを外部に保存。

mirror/vmirror

左右反転、上下反転のコマンド。

; 0番のセルを左右反転
exec_dll "sp.dll/mirror,200,0,0"
exec_dll "sp.dll/mirror,200,0,1"
; 1番のセルを上下反転
exec_dll "sp.dll/vmirror,200,1,0"
exec_dll "sp.dll/vmirror,200,1,1"

実行例

応用例

当然ながら、左右反転と上下反転を両方をすると、180度回転と同じ効果が得られます。

negative/monocrome/grayscale

ネガ、モノクロ、グレースケールのコマンド。
モノクロとグレースケールの違いは、計算式の違い。グレースケールの方が一般的には「自然」とされる計算式を使っています。
これら色変えのコマンドは、通常マスク画像部分を処理する必要がありません。

exec_dll "sp.dll/negative,200,0,0" ; ネガティブ
exec_dll "sp.dll/monocrome,200,1,0" ; モノクロ
exec_dll "sp.dll/grayscale,200,2,0" ; グレースケール

実行例

応用例

マスク画像部分をネガティブ反転させて、実体部分を適当な背景画にして表示すると、「人の形に背景が切り抜かれている」ようにできます。

mozaic

モザイクのコマンド。
モザイクのコマンドには、さらに6つの引数が必要です。モザイクをかけたい領域の左上と右下のx座標とy座標、それにモザイクの大きさ(幅と高さ)です。

exec_dll "sp.dll/mozaic,200,0,0,130,90,240,130,4,8"
; スプライト番号200、セル番号0、マスク番号0(実体部分)の
; (130,90)-(240,130)の領域にモザイクをかける。
; モザイク一つの大きさは幅4ドット、高さ8ドット
実行例

応用例

モザイクの大きさのどちらかに1を指定し、もう一つを極端に大きくしてみます。

exec_dll "sp.dll/mozaic,200,0,0,0,0,415,160,1,16"


なんだかさらにみのもんたの相談者みたいになりました。

fill/gradation/vgradation

単色塗り潰し、グラデーション塗り潰し横と縦のコマンドです。
単色塗り潰し(fill)は、さらに色を指定する三つ引数が必要です。
グラデーション二つは、色を指定する三つの引数がさらにもう一つ必要です。
単色塗り潰しの場合、指定されたセル部分をその色で塗り潰します。
グラデーション(横)は、一番左に指定された最初の色、一番右に指定された後の色、その間を中間色で埋めます。
グラデーション(縦)は、上から下に向かう以外はグラデーション(横)と変わりません。

exec_dll "sp.dll/fill,200,0,0,255,0,0"
exec_dll "sp.dll/gradation,200,1,0,255,255,255,0,0,0"
exec_dll "sp.dll/vgradation,200,2,0,255,0,255,0,255,0"

実行例

元画像 fill/単色塗り潰し gradation/横グラデ vgradation/縦グラデ

応用例

立ち絵を加工するよりも、グラデーションのできる塗り潰し長方形と考えた方がよいかも知れません。

smooth

ぼかしフィルターのコマンド。
すりガラスで透かしたような画像を作成します。
このコマンドは、元になる画像と処理された画像が別々になります。

lsph 200,":a;image.bmp",0,0
lsp 201,":a;image.bmp",0,0
exec_dll "sp.dll/smooth,200,0,0,201,0,0,5,5"
; スプライト番号200・セル番号0の実体部分を、
; スプライト番号201・セル番号0の実体部分に、
; ぼかし処理をしてからコピーします。
; 最後二つの5,5は、それぞれ横方向と縦方向のぼかしの強さです。1だとただのコピーになります。2以上の数値を指定してください。

実行例

加工前画像 加工後画像 使用例

ピンボケ写真風演出に使えますね。無論、背景をボケさせても構わないのでしょうが。
一部分だけボケさせたい時は、後述のcropなどで切りだして、ぼかしを入れて、それを貼るなりするのがよいでしょう。

copy

スプライトの実体部分かマスク部分を選んで、それを別のスプライトにそのまま貼り付ける命令。
これも二つのスプライトを使用します。

exec_dll "sp.dll/copy,200,0,0,201,0,0"
; スプライト番号200・セル番号0の実体部分を、
; スプライト番号201・セル番号0の実体部分に、
; そのまま貼り付ける。

なお、位置や大きさの指定はありません。
もし、二つのスプライトの大きさが違った場合、この命令はできるだけのことをします。
元>先だった場合は、はみ出た分は無視されます。逆に元<先だった場合は、先の部分に元画像が残る部分が出てきます。
拡大縮小がしたい場合は、後述のexpandを使用します。

rotate

回転コピーコマンドです。
コピー元からコピー先へ、90度回転させてからコピーします。

lsp 200,":a;image.bmp",0,0 ; 大きさを、415*480とする。
lsp 201,":a;>960,415,#FFFFFF",0,0 ; 480*415の画像を作成する。ただし、アルファブレンドにするならば、さらに幅を倍にする。
; 書式 (コピー元のスプライト指定),(コピー先のスプライト指定),(回転方向)
; 回転方向は1で時計回り、-1で反時計回り
exec_dll "sp.dll/rotate,200,0,0,201,0,0,1"
exec_dll "sp.dll/rotate,200,0,1,201,0,1,1"
; 実体部とマスク部の両方をしないと意味がない。

予め、コピー先の大きさはコピー元の大きさをタテヨコを入れ替えたものを、塗り潰し長方形などを使って作ってください。

実行例

200 201

無事に横になりましたが、さて。

応用例

あまり使い道のない効果かと思います。ノベルの立ち絵などよりも、アクションなどで必要になるかと。

crop/patch

切り出し命令
あるスプライトの一部を指定し、その部分を別のスプライトに貼り付ける命令です。

lsp 200,":a;image.bmp",0,0
lsp 201,":a;>560,140,#FFFFFF",0,0
; (コピー元スプライト番号),(セル番号),(マスク番号),(コピー開始x),(コピー開始y),(コピー先スプライト番号),(セル番号),(マスク番号)
exec_dll "sp.dll/crop,200,0,0,70,40,201,0,0"
exec_dll "sp.dll/crop,200,0,1,70,40,201,0,1"
; 実体部分とマスク部分の両方をコピーする。

コピー元画像の指定した座標から、コピー先がいっぱいになるまでをコピーします。

実行例

200 201

顔グラフィックができました。

応用例

部分的な加工を実現するための基本になる命令です。
加工したい部分をこれで切りだしておいて、それを様々に加工後、元の画像に重ね合わせるなどします。

patch

貼りつけ命令
cropと対になることを想定して作られた命令です。
cropと同じ書式で、コピー先とコピー元を入れ替えた動作をします。
つまり、

  • cropで切り出す。
  • 切り出したスプライトを色々加工する。
  • patchで戻す。(cropの時と同じパラメータを与える)

このように処理できます。

expand

拡大縮小コピーのコマンド

lsp 200,":a;image.bmp",0,0
lsp 201,":a;>560,640,#FFFFFF",0,0
; (コピー元スプライト番号),(セル番号),(マスク番号),(コピー先スプライト番号),(セル番号),(マスク番号)
exec_dll "sp.dll/expand,200,0,0,201,0,0"
exec_dll "sp.dll/expand,200,0,1,201,0,1"
; 実体部分とマスク部分の両方を拡大縮小コピーする。

コピー元画像全体を、コピー先画像の大きさに合わせて拡大縮小してコピーします。
速度よりも滑らかさを重視した(結果が出ているかどうかはさておき)アルゴリズムを採用しています。
※結果、非常に処理が重くなりましたので、多用は禁物です。

実行例

200 201

write

文字を書きこむコマンドです。引数が多く、またスプライトの指定も通常から外れていますので、ずれないように注意してください。
※横書き専用です。

exec_dll "sp.dll/write,200,0,0,0,HGP創英角ポップ体,24,48,0,255,0,0,255,右代宮戦人"
; 200, 0 : スプライト番号200のセル番号0を書き込み対象とします。※マスク指定はありません。注意。
; 0, 0 : 書き込みの左上位置を指定します。
; HGP創英角ポップ体, フォント名を指定します。必ず指定して、間違えないようにしてください。
; 24, 48, 0 : フォントのサイズです。横幅、高さ、文字間の指定です。横幅は高さの半分が基本です。英文指定です。
; 255, 0, 0 : フォントの色です。この場合真っ赤を指定しています。
; 255 : 文字のアルファブレンドです。255にすると不透明です。
; 右代宮戦人 : 表示する内容です。

書込み先のスプライトがコピーかアルファブレンドかは自動で判別します。
文字列が長く、表示するとスプライトからはみ出てしまう場合は、そこで書き込みをやめるようになっています。
また、これにはgetretによる返り値があります。

getret $0 ; 与えられた文字列のうち、書き込みできなかった分の文字列が戻ってきます。
getret %0 ; 書き込んだ文字列領域の右端のx座標が戻ってきます。

$0に何か入っていれば、書き込みができなかったことがわかります。
%0を見れば、次はどこから書きこめばよいかの指針になります。

実行例

形式 加工前 加工後
:a;に書き込んだ場合
:c;に書き込んだ場合

応用例

フォントに「@」で始まる縦書き用フォントを指定して作成します。
それを時計回りrotateさせます。

縦書きフォント rotate
lsp 200,":a;>800,24,#FFFFFF",0,0
lsp 201,":a;>48,400,#FFFFFF",0,0
exec_dll "sp.dll/write,200,0,0,0,@HGP創英角ポップ体,12,24,0,255,0,0,255,右代宮戦人"
exec_dll "sp.dll/rotate,200,0,0,201,0,0,1"
exec_dll "sp.dll/rotate,200,0,1,201,0,1,1"

一応これで、縦書きも可能になります。

save

保存の命令です。
指定されたスプライトの画像を、bmp形式で外部ファイルに出力します。
書式的にはスプライト番号の指定だけが必要です。

exec_dll "sp.dll/save,200" ; 200番のスプライトを、"200.bmp"の名前で保存する。(指定しなければこうなる。)
exec_dll "sp.dll/save,201,tumbnail.bmp" ; 200番のスプライトを、"thumbnail.bmp"の名前で保存する。

当然ながら、保存された画像は別の命令で読み込むことが可能です。
また、getretによる返り値が取得できます。

getret $0 ; 保存するのに使ったファイル名が取得できます。

ファイル名を指定せずに保存した時、自動で与えられるファイル名がこれで取得できますので、そのままlsp2や他の命令に渡すことができます。

応用例

加工して保存した後、その画像をlsp2で読みこめば、間接的にlsp2を加工できることになります。

ちょっとこれは意味わかんない

検索エンジンさんマジパねーっす。
Yahooから「ジェフをビートマップに変換」でこのブログにたどり着いた人がいる。誰だよジェフって。
「もしかして」も「ジェフ ビットマップに変換」ではありませんか?とこれまた意味不明。なんでそこまでジェフにこだわる。
やっぱりこれ、「GIFをBMPに変換」と言いたかったんだろうか。わからんわー。

2011年02月05日のツイート

スプライト操作DLLマニュアル

DLL本体はこれ。

スプライトの基礎

スプライト操作DLLでは、lsp(or lsph)で作成したスプライトを操作するができます。
その際、スプライトのどの部分を操作するか、指定の方法が少々特殊です。

たとえば、このような画像があったとして、それを読み込みます。恐らく、このようにしなければまともには表示されないはずです。

lsp 200,":a/3,0,3;image.bmp",0,0 ; 右側にマスク画像あり(:a)で3セル。

スプライト操作DLLでは、常にどのスプライトを対象とするか、スプライト番号だけでなくセル番号とマスク番号まで指定するようにします。
書式にすると

(スプライト番号),(セル番号),(マスク番号)

となります。
たとえば、「200,0,1」とした場合は「200番のスプライトの、0番目(一番左)のセルの、マスク画像部分」を意味します。

exec_dll "sp.dll/mirror,200,0,0" ; 左右反転コマンド。200番のスプライトの0番目のセルの実体部分が対象。
exec_dll "sp.dll/mirror,200,0,1" ; 左右反転コマンド。200番のスプライトの0番目のセルのマスク画像部分が対象。
; ここまでしないと、恐らく意図したとおりに「左右反転」はできない。

このようにコマンドによっては、事実上2回の指定が必要な場合もあります。
※実体部分とマスク画像部分を別々に扱うようにしたのは、それが必要な場面も存在するからです。

コマンドの基礎

スプライト操作DLLの命令の与え方は、基本的に以下のようになっています。

exec_dll "sp.dll/(コマンド),(スプライト番号),(セル番号),(マスク番号)"

その他必要な引数があれば、後に続けるようになっています。
以下、それぞれのコマンドについて。

命令リスト

getpixel
ドットの色と不透明度を取得
line/polyline
直線描画/多角形描画
paint
境界色指定塗りつぶし。
mirror/vmirror
鏡面/天地鏡面
negative/monocrome/grayscale
ネガ/モノクロ/グレースケール
mozaic
モザイク
fill/gradation/vgradation
フィル/グラデーション/上下グラデーション
smooth
なめらかにする。
shade/burst
陰化/侵食
copy
全コピー
rotate
回転
crop/patch
切り取り/貼りつけ
expand
拡大縮小
write
文字を書きこむ。
save
スプライトを外部に保存。

mirror/vmirror

左右反転、上下反転のコマンド。

; 0番のセルを左右反転
exec_dll "sp.dll/mirror,200,0,0"
exec_dll "sp.dll/mirror,200,0,1"
; 1番のセルを上下反転
exec_dll "sp.dll/vmirror,200,1,0"
exec_dll "sp.dll/vmirror,200,1,1"

実行例

応用例

当然ながら、左右反転と上下反転を両方をすると、180度回転と同じ効果が得られます。

negative/monocrome/grayscale

ネガ、モノクロ、グレースケールのコマンド。
モノクロとグレースケールの違いは、計算式の違い。グレースケールの方が一般的には「自然」とされる計算式を使っています。
これら色変えのコマンドは、通常マスク画像部分を処理する必要がありません。

exec_dll "sp.dll/negative,200,0,0" ; ネガティブ
exec_dll "sp.dll/monocrome,200,1,0" ; モノクロ
exec_dll "sp.dll/grayscale,200,2,0" ; グレースケール

実行例

応用例

マスク画像部分をネガティブ反転させて、実体部分を適当な背景画にして表示すると、「人の形に背景が切り抜かれている」ようにできます。

mozaic

モザイクのコマンド。
モザイクのコマンドには、さらに6つの引数が必要です。モザイクをかけたい領域の左上と右下のx座標とy座標、それにモザイクの大きさ(幅と高さ)です。

exec_dll "sp.dll/mozaic,200,0,0,130,90,240,130,4,8"
; スプライト番号200、セル番号0、マスク番号0(実体部分)の
; (130,90)-(240,130)の領域にモザイクをかける。
; モザイク一つの大きさは幅4ドット、高さ8ドット
実行例

応用例

モザイクの大きさのどちらかに1を指定し、もう一つを極端に大きくしてみます。

exec_dll "sp.dll/mozaic,200,0,0,0,0,415,160,1,16"


なんだかさらにみのもんたの相談者みたいになりました。

fill/gradation/vgradation

単色塗り潰し、グラデーション塗り潰し横と縦のコマンドです。
単色塗り潰し(fill)は、さらに色を指定する三つ引数が必要です。
グラデーション二つは、色を指定する三つの引数がさらにもう一つ必要です。
単色塗り潰しの場合、指定されたセル部分をその色で塗り潰します。
グラデーション(横)は、一番左に指定された最初の色、一番右に指定された後の色、その間を中間色で埋めます。
グラデーション(縦)は、上から下に向かう以外はグラデーション(横)と変わりません。

exec_dll "sp.dll/fill,200,0,0,255,0,0"
exec_dll "sp.dll/gradation,200,1,0,255,255,255,0,0,0"
exec_dll "sp.dll/vgradation,200,2,0,255,0,255,0,255,0"

実行例

元画像 fill/単色塗り潰し gradation/横グラデ vgradation/縦グラデ

応用例

立ち絵を加工するよりも、グラデーションのできる塗り潰し長方形と考えた方がよいかも知れません。

smooth

ぼかしフィルターのコマンド。
すりガラスで透かしたような画像を作成します。
このコマンドは、元になる画像と処理された画像が別々になります。

lsph 200,":a;image.bmp",0,0
lsp 201,":a;image.bmp",0,0
exec_dll "sp.dll/smooth,200,0,0,201,0,0,5,5"
; スプライト番号200・セル番号0の実体部分を、
; スプライト番号201・セル番号0の実体部分に、
; ぼかし処理をしてからコピーします。
; 最後二つの5,5は、それぞれ横方向と縦方向のぼかしの強さです。1だとただのコピーになります。2以上の数値を指定してください。

実行例

加工前画像 加工後画像 使用例

ピンボケ写真風演出に使えますね。無論、背景をボケさせても構わないのでしょうが。
一部分だけボケさせたい時は、後述のcropなどで切りだして、ぼかしを入れて、それを貼るなりするのがよいでしょう。

copy

スプライトの実体部分かマスク部分を選んで、それを別のスプライトにそのまま貼り付ける命令。
これも二つのスプライトを使用します。

exec_dll "sp.dll/copy,200,0,0,201,0,0"
; スプライト番号200・セル番号0の実体部分を、
; スプライト番号201・セル番号0の実体部分に、
; そのまま貼り付ける。

なお、位置や大きさの指定はありません。
もし、二つのスプライトの大きさが違った場合、この命令はできるだけのことをします。
元>先だった場合は、はみ出た分は無視されます。逆に元<先だった場合は、先の部分に元画像が残る部分が出てきます。
拡大縮小がしたい場合は、後述のexpandを使用します。

rotate

回転コピーコマンドです。
コピー元からコピー先へ、90度回転させてからコピーします。

lsp 200,":a;image.bmp",0,0 ; 大きさを、415*480とする。
lsp 201,":a;>960,415,#FFFFFF",0,0 ; 480*415の画像を作成する。ただし、アルファブレンドにするならば、さらに幅を倍にする。
; 書式 (コピー元のスプライト指定),(コピー先のスプライト指定),(回転方向)
; 回転方向は1で時計回り、-1で反時計回り
exec_dll "sp.dll/rotate,200,0,0,201,0,0,1"
exec_dll "sp.dll/rotate,200,0,1,201,0,1,1"
; 実体部とマスク部の両方をしないと意味がない。

予め、コピー先の大きさはコピー元の大きさをタテヨコを入れ替えたものを、塗り潰し長方形などを使って作ってください。

実行例

200 201

無事に横になりましたが、さて。

応用例

あまり使い道のない効果かと思います。ノベルの立ち絵などよりも、アクションなどで必要になるかと。

crop/patch

切り出し命令
あるスプライトの一部を指定し、その部分を別のスプライトに貼り付ける命令です。

lsp 200,":a;image.bmp",0,0
lsp 201,":a;>560,140,#FFFFFF",0,0
; (コピー元スプライト番号),(セル番号),(マスク番号),(コピー開始x),(コピー開始y),(コピー先スプライト番号),(セル番号),(マスク番号)
exec_dll "sp.dll/crop,200,0,0,70,40,201,0,0"
exec_dll "sp.dll/crop,200,0,1,70,40,201,0,1"
; 実体部分とマスク部分の両方をコピーする。

コピー元画像の指定した座標から、コピー先がいっぱいになるまでをコピーします。

実行例

200 201

顔グラフィックができました。

応用例

部分的な加工を実現するための基本になる命令です。
加工したい部分をこれで切りだしておいて、それを様々に加工後、元の画像に重ね合わせるなどします。

patch

貼りつけ命令
cropと対になることを想定して作られた命令です。
cropと同じ書式で、コピー先とコピー元を入れ替えた動作をします。
つまり、

  • cropで切り出す。
  • 切り出したスプライトを色々加工する。
  • patchで戻す。(cropの時と同じパラメータを与える)

このように処理できます。

expand

拡大縮小コピーのコマンド

lsp 200,":a;image.bmp",0,0
lsp 201,":a;>560,640,#FFFFFF",0,0
; (コピー元スプライト番号),(セル番号),(マスク番号),(コピー先スプライト番号),(セル番号),(マスク番号)
exec_dll "sp.dll/expand,200,0,0,201,0,0"
exec_dll "sp.dll/expand,200,0,1,201,0,1"
; 実体部分とマスク部分の両方を拡大縮小コピーする。

コピー元画像全体を、コピー先画像の大きさに合わせて拡大縮小してコピーします。
速度よりも滑らかさを重視した(結果が出ているかどうかはさておき)アルゴリズムを採用しています。
※結果、非常に処理が重くなりましたので、多用は禁物です。

実行例

200 201

write

文字を書きこむコマンドです。引数が多く、またスプライトの指定も通常から外れていますので、ずれないように注意してください。
※横書き専用です。

exec_dll "sp.dll/write,200,0,0,0,HGP創英角ポップ体,24,48,0,255,0,0,255,右代宮戦人"
; 200, 0 : スプライト番号200のセル番号0を書き込み対象とします。※マスク指定はありません。注意。
; 0, 0 : 書き込みの左上位置を指定します。
; HGP創英角ポップ体, フォント名を指定します。必ず指定して、間違えないようにしてください。
; 24, 48, 0 : フォントのサイズです。横幅、高さ、文字間の指定です。横幅は高さの半分が基本です。英文指定です。
; 255, 0, 0 : フォントの色です。この場合真っ赤を指定しています。
; 255 : 文字のアルファブレンドです。255にすると不透明です。
; 右代宮戦人 : 表示する内容です。

書込み先のスプライトがコピーかアルファブレンドかは自動で判別します。
文字列が長く、表示するとスプライトからはみ出てしまう場合は、そこで書き込みをやめるようになっています。
また、これにはgetretによる返り値があります。

getret $0 ; 与えられた文字列のうち、書き込みできなかった分の文字列が戻ってきます。
getret %0 ; 書き込んだ文字列領域の右端のx座標が戻ってきます。

$0に何か入っていれば、書き込みができなかったことがわかります。
%0を見れば、次はどこから書きこめばよいかの指針になります。

実行例

形式 加工前 加工後
:a;に書き込んだ場合
:c;に書き込んだ場合

応用例

フォントに「@」で始まる縦書き用フォントを指定して作成します。
それを時計回りrotateさせます。

縦書きフォント rotate
lsp 200,":a;>800,24,#FFFFFF",0,0
lsp 201,":a;>48,400,#FFFFFF",0,0
exec_dll "sp.dll/write,200,0,0,0,@HGP創英角ポップ体,12,24,0,255,0,0,255,右代宮戦人"
exec_dll "sp.dll/rotate,200,0,0,201,0,0,1"
exec_dll "sp.dll/rotate,200,0,1,201,0,1,1"

一応これで、縦書きも可能になります。

save

保存の命令です。
指定されたスプライトの画像を、bmp形式で外部ファイルに出力します。
書式的にはスプライト番号の指定だけが必要です。

exec_dll "sp.dll/save,200" ; 200番のスプライトを、"200.bmp"の名前で保存する。(指定しなければこうなる。)
exec_dll "sp.dll/save,201,tumbnail.bmp" ; 200番のスプライトを、"thumbnail.bmp"の名前で保存する。

当然ながら、保存された画像は別の命令で読み込むことが可能です。
また、getretによる返り値が取得できます。

getret $0 ; 保存するのに使ったファイル名が取得できます。

ファイル名を指定せずに保存した時、自動で与えられるファイル名がこれで取得できますので、そのままlsp2や他の命令に渡すことができます。

応用例

加工して保存した後、その画像をlsp2で読みこめば、間接的にlsp2を加工できることになります。

ちょっとこれは意味わかんない

検索エンジンさんマジパねーっす。
Yahooから「ジェフをビートマップに変換」でこのブログにたどり着いた人がいる。誰だよジェフって。
「もしかして」も「ジェフ ビットマップに変換」ではありませんか?とこれまた意味不明。なんでそこまでジェフにこだわる。
やっぱりこれ、「GIFをBMPに変換」と言いたかったんだろうか。わからんわー。

2011年02月05日のツイート