BMP・ BGA プレビューウィンドウ
#BMP
タブや #BGA
(座標定義) タブのパネル下部にある を左クリックすると、選択した定義内容をプレビュー表示する子ウィンドウが開きます。
プレビューウィンドウはモードレスです。このウィンドウを最前面に開いたまま、
プレビューウィンドウはサイズを変更できます。プレビューウィンドウの外周にリサイズ判定があります。
プレビュー領域 (背景が黒い部分) に BMP・
プレビュー領域の中央 256 pixels 四方は、一般的な BMS アプリケーションにおける “実際に映像が表示される領域” を示します。本稿ではキャンバスと呼びます。
“BG-Line” が有効のとき、キャンバスの外は緑色の水平線で覆われます。#BGA
座標定義などで 256 × 256 pixels より大きい画像を使用する場合、非表示領域の情報も参考にすることができます。
座標を明示せずに画像を表示したとき、キャンバスにおいて、
- 幅か高さが 256 pixels を超える画像を一切表示しない機種や、センタリングせず拡大縮小する機種、フリーサイズ BGA 対応機種などもあります。それらについて本稿では触れません。
“Lock”
チェックボックスやラベル行を左クリックするか、もしくはチェックボックスにフォーカスして Space キーを押下すると、このオプションの有効・無効が切り替わります。初期状態では “Lock” は無効になっています。
“Lock” が無効のとき、定義リストカーソルを移動すると、選択されたオブジェクトの内容がプレビュー領域に即時描画されます。
“オブジェ単体選択時にプレビューする” が有効なら、メインパネル上の映像オブジェクトを単体選択したときも、プレビュー内容が更新されます。
(音声オブジェクトをプレビューする場合とは異なり、左クリックした映像オブジェクトが既に選択された状態なら、プレビュー内容は更新されません。)
“Lock” が有効である間は、座標入力フォームへの入力時のみ、描画内容が更新されます。それ以外の操作では描画内容は更新されません。新規作成や、表示中の定義の消去や、画像ファイル自体の削除などを行ったとしてもです。
座標入力フォーム
座標入力フォーム (X1, Y1, X2, Y2, dX, dY) は、
- フォームに入力した座標は即座にプレビューに反映されます。
- 無効な値を入力すると不具合が発生するのでご注意ください。
- 画像ファイルの座標系:
- キャンバスの座標系:
- 座標 X1, Y1, X2, Y2 は、画像ファイルの左上隅を原点 (0, 0) とします。
- 座標 (X1, Y1) は、
#BGA
がトリミングする領域の、左上頂点です。 - 座標 (X2, Y2) は、
#BGA
がトリミングする領域の、右下頂点です。 - 座標 dX, dY は、キャンバスの左上隅を原点 (0, 0) とします。
- 座標 (dX, dY) は、トリミング領域をキャンバスに描画する位置です。
#BGA は、任意の画像から任意の矩形領域をコピーして、それをキャンバスの任意位置に貼り付けるようなものと考えてください。この切り抜き操作を本稿ではトリミングと呼んでいますが、英語ではクロップと呼ぶようです。
座標指定の具体例
bga_320-64.bmp は、#BMP01
に定義し、座標 (64, 64) ~ (128, 128) をトリミングすると、この領域を新たな映像オブジェクトとして使用することが可能になります。
ここで描画座標 (dX, dY) を (96, 96) と指定すると、トリミングした領域をキャンバスの (96, 96) の位置から描画します。
ここで コピーして #BGA
に定義すると (後述)、コピーした時点におけるプレビュー状態を「#BMP
と同様の画像オブジェクト」として配置することができます。これによって、シンプルなアニメーションは画像 1 枚だけで表現でき、アーカイブ容量を削減できます。
たとえばトリミング範囲を固定し、描画座標だけを少しずつ変更しながら複数定義して配置すれば、トリミング範囲の図像を縦横無尽に動かせるでしょう。
描画座標を固定し、トリミング範囲だけを少しずつ変更しながら複数定義して配置すれば、クレジット等のスクロールが画像 1 枚で実現するでしょう。
他にも様々な応用ができます。座標指定のみで表現できる種類のアニメーション (単純なフレームリサイズやスクロールなど) なら、低容量で実現できます。
座標入力フォームの入力範囲と読み込み範囲
- 文字列長
-
- 半角・全角問わず 8 文字まで (9 文字以上は切り捨てる)
- 文字列値
-
- 半角英数字を入力可 (IME は常に無効になる)
- 貼り付けにより、マルチバイト文字なども入力可
- プレビュー時、文字列は値
0
とみなす (値自体は文字列から変化せず) - 文字列値も座標として コピーできてしまう
- 負数の値
-
#BGA
仕様では禁止されていないが、入力不可- 負数の値がフォームに現れた瞬間、値を
0
に書き換える - (この書き換えは、フォーム有効範囲の判定よりも優先される)
- 小数の値
-
- 入力可・プレビュー可・コピー可
- 値はそのままで整数に丸めて表示 (
0.500001
なら1
とみなす) - 境界の値は偶数側に丸める (
0.5
→0
、1.5
→2
、2.5
→2
、3.5
→4
)
- 空の値
-
- プレビュー時は値
0
とみなし、コピー時は値0
としてコピーする
- プレビュー時は値
- 描画可能範囲
-
- [Windows 11
/10 /8.1 /8 /7] 幅・高さ上限 65534 pixels (座標 0
~ 65534
) - [Windows Vista
/XP /2000] 幅・高さ上限 32767 pixels (座標 0
~ 32767
) - [Windows ME
/98 /95] 幅・高さ上限 16383 pixels (超えると強制終了) - 実際の表示可能サイズはメモリやビデオメモリによっても異なる模様
- Windows 2000
/XP 以降、表示できなかった領域は黒で塗り潰される
#BMP
の自動センタリングの基準は「表示できた幅」。幅 65534 pixels を表示できたなら、画像の実際の幅が 70000 pixels であれ 80000 pixels であれ、センタリング座標 X1, X2 は必ず32639
~ 32895
になる。Windows 95
/98 /ME 上で、ファイルサイズが約 12000000 bytes (約 11.4 MiB) よりも大きい画像を表示すると、 BMSE が強制終了する。バックアップは作成されない。 2000 × 2000 pixels × 24 bpp が目安。 Create
関数の 16 MiB 制限と関係がありそう。DIBitmap - [Windows 11
- 有効範囲
-
- 座標入力フォームの有効範囲は、符号つき 32 ビット整数
2.147E+9
を超える値がフォームに現れた瞬間、BMSE が強制終了する - 強制終了時、編集作業の一時バックアップファイルは生成されない
- 対応形式
-
- BMP、
GIF、 JPEG、アイコンファイル (ICO) の一部、メタファイル (WMF)、拡張メタファイル (EMF) - Visual Basic 6.0 の機能で読み込みを行うため、
PNG は表示しない - 非対応形式の画像を参照する
#BGA
や、無効な値が指定された#BGA
を初回に表示すると、プレビューウィンドウが空っぽになる
- BMP、
- 備考
-
- 一部機種は負数座標も解釈するが、
BMSE は負数座標を扱わない
- 一部機種は負数座標も解釈するが、
#BGA
定義リストに座標を定義する作業手順の例
- プレビューウィンドウ上で、トリミング座標や描画位置座標を調整する
- を左クリックして、現在プレビュー中の表示状態をコピー
#BGA
タブの入力フォームに、コピーした情報を貼り付けて
プレビューウィンドウを介さず、#BGA
タブの入力フォームに値を直接入力することも可能です。しかし通常は、必要な情報をプレビューウィンドウからコピーするほうが簡単でしょう。
単純な動きやパターンであれば、テキストエディタ上などでマクロを組んで、#BGA
を一括定義することもできるでしょう。
プレビューウィンドウまとめ
- タイトルバー
- 定義番号とファイル名 (
#BGA
の場合は参照元画像のフルパス) を表示 - Num
#BMP
の定義番号を表示- X1, Y1
#BGA
における、参照元画像のトリミング始点 (左上) 座標- X2, Y2
#BGA
における、参照元画像のトリミング終点 (右下) 座標- dX, dY
#BGA
における、トリミング領域をキャンバスに描画する位置の座標 (キャンバス左上隅からの相対座標)- 現在のプレビュー状態の定義番号と座標情報を
#BGA
書式でコピー - BG-Line
-
- 映像が表示されない領域に、緑の水平線を 8 pixels 間隔で表示
- 映像が表示されない領域に、緑の水平線を表示しない
- Lock
-
- プレビュー表示内容を固定 (座標入力時のみ表示を更新)
- プレビュー表示内容を常に更新
#BMP01
または#BGA01
の定義内容を表示 (未定義なら黒を表示)-
前の番号の内容を表示 (未定義なら定義がある番号までスキップ)
- “拡張定義を使用しない” が有効のとき、
16 進数番号のみ表示
- “拡張定義を使用しない” が有効のとき、
-
次の番号の内容を表示 (未定義なら定義がある番号までスキップ)
- “拡張定義を使用しない” が有効のとき、
16 進数番号のみ表示
- “拡張定義を使用しない” が有効のとき、
- /
-
定義リスト末尾番号の内容を表示 (未定義なら黒を表示)
- “拡張定義を使用しない” が有効のとき、末尾番号は
FF
- “拡張定義を使用しない” が有効のとき、末尾番号は
#BGA
タブ
#BGA
は、#BMP
に定義した画像の座標を指定してトリミングや表示位置変更を行い、これを新たに「配置可能な画像オブジェクト」として定義する拡張命令です。
#BGA
は定義番号を #BMP
と共有しています。便宜上 #BMP
タブと #BGA
タブは分かれていますが、じつのところ両者は同一のリスト、同一のパレット、同一のタブとみなすことができます。
値の書式は “Num X1 Y1 X2 Y2 dX dY
” です。値は半角空白区切りで記述します。
#BGA
がトリミングするために参照する#BMP
の定義番号#BGA
がトリミングする領域の左上頂点の座標#BGA
がトリミングする領域の右下頂点の座標#BGA
がトリミングした領域をキャンバスに描画する位置の座標
#BMP
と #BGA
の定義番号を重複させないでください
たとえば、番号が重複する映像オブジェクト 01
番を配置すると、
- BMSE を含む大半の
#BGA
対応機種は#BGA01
を表示します。 - ただし MixWaver とナナシグルーヴは
#BMP01
を表示します。 - いうまでもなく、
#BGA
非対応機種は#BMP01
を表示します。
このように互換性が損なわれるため、ある番号の #BMP
と #BGA
について、どちらか一方は常に定義を空けておくスタイルが推奨されます。
- よくない例
-
#BMP01 bga_320-64.bmp
#BGA01 01 0 64 128 144 64 80
- よい例 1
-
#BMP01 bga_320-64.bmp
#BGA02 01 0 64 128 144 64 80
- よい例 2
-
#BMP02 bga_320-64.bmp
#BGA01 02 0 64 128 144 64 80
#BGA
タブの操作
#BGA
タブの操作は #BMP
タブとほぼ同じです。異なる部分だけ解説します。
- リスト上で左クリック
-
リストアイテムを選択します。
(Home、 End、 Page Up、 Page Down、矢印キーも同様) 選択した番号の定義内容は
#BGA
入力枠に表示されます。#BGA
は#BMP
と定義番号を共有しているため、両者の定義リストカーソルは連動します。 - 右クリック
-
#BGA
定義リスト上で右クリックしても何も起きません。#BGA
入力枠ではコンテキストメニューを開きます。(アプリケーションキーや [Shift + F10] も同様) - (Shift +) テンキー ±
-
#BGA
ではなく、#BMP
の定義リストカーソルが移動します。[Shift + テンキー±] では 3 行分移動します。 この操作だけは
#BMP
と#BGA
の定義リストカーソルが連動しません。バグかもしれません。 - 、
Ctrl + (Shift +) テンキー ± -
選択カーソル行の定義内容を、
1 行先の定義と入れ替えます。 [Ctrl + Shift + テンキー±] なら 3 行先まで入れ替えます。
#BMP
と#BGA
のリスト順は連動して入れ替わります。#BGA
の最初の値も連動します。#BMP
と#BGA
は定義番号を共有するため、これは正しい挙動です。この操作で再生内容が狂うことはありません。- 拡張命令タブには影響を及ぼしません。拡張命令タブ内に存在する定義や配置は、この操作によって内容が狂う可能性があります。
[Ctrl + Shift + テンキー±] は Undo Counter を 3 進めます。つまり “元に戻す/やり直し” は 3n 回分の実行が必要です。
-
#BGA
入力枠 -
妥当な値は [
Num X1 Y1 X2 Y2 dX dY
] (半角空白区切り) です。プレビューウィンドウの表示内容を、
を左クリックしてコピーし、このフォームに貼り付ければ、妥当な値となります。 -
妥当でない値も直接入力できてしまいます。これらは BMS アプリケーションに不具合をもたらすでしょう。
テキストボックス内の操作は、ダイレクト入力枠を参照。
-
- ボタン押下
-
選択カーソル行の
#BGA
定義内容を消去します。( #BGA
入力枠の内容は消去しません。)ボタンを左クリックするか、ボタン領域にフォーカスがあるとき Space
/Enter キーで、ボタンを押下します。 - 押下
-
現在の
#BGA
入力枠の内容を、選択カーソル行に定義します。(このとき入力枠を空にします。) ボタンを左クリックするか、ボタン領域にフォーカスがあるとき Space
/Enter キーで、
#BGA
の互換性に関する問題
詳細は外部資料をご覧ください。この場では要約を列挙します。
- そもそもあまりサポートされていません。
- BM98de
/DDR の #BGA
は、他機種が採用する書式とは微妙に異なります。 - MixWaver は、
#BMP
定義番号を[00-03]
しか参照できません。 - MixWaver は、
#BMP
を座標 (637, 437) までしかトリムできません。 #BMP
と#BGA
の定義番号重複時、ナナシグルーヴは#BMP
を表示します。- WAview は、キャンバス表示位置の原点座標があからさまに奇妙です。
- BMSE
/uBMplay (1.5.0 未満) は負数座標に対応していません。 - BM98de
/DDR は、トリム座標に「端の 1 pixel」を含めます。 #BGA00
を#BMP00
代わりに使えるかどうかが、機種ごとに異なります。#BMP00
を参照してトリムできるかどうかが、機種ごとに異なります。#BMP01
を番号1
として参照できるかどうかも機種ごとに異なります。#BGA
の値区切り文字を連続できるかどうかも機種ごとに異なります。
【外部資料に書き損ねた事柄】 「256 pixels 四方のキャンバス」より大きなサイズを切り抜いた場合に、キャンバスから溢れる領域を表示するかどうかが機種ごとに異なります。
「キャンバスより大きいトリム画像」の描画開始位置を指定するために、負数座標が必要になる場合があります。再び 320 pixels 四方の画像 を例示します。
#TITLE Cropped 320
#BPM 120
#BMP01 bga_320-64.bmp
#BGA02 01 32 0 288 256 0 0
#BGA03 01 0 0 320 320 0 0
#BGA04 01 0 0 320 320 -32 0
#00104:01020304
#00204:01020304
#00211:01
#BGA02
は、#BMP01
をプレビューウィンドウに表示してそのまま しただけです。明示的に 256 pixels 四方を切り抜いたともいえます。#BGA03
は、#BMP01
の画像そのものの幅と高さを切り抜いたものです。#BGA04
は、#BGA03
を手動でセンタリングしようと試みたものです。
前述の BMS コードは、
BGAEnc