前回までに試したBitmap作成方法の違いによる動作の差異をまとめると
以下の表になる。
今回はこの差異の原因について考えてみたい。
上表の違いを明確に解説した情報は見つからなかったので、推察なのだが、
Dim PicBmp As New Bitmap(PicBox.Image)でBitmapを作成する方法では
新たにBitmapクラスのデータ域をメモリ上に“32bit ARGB”で確保し、
そこに対象のイメージデータを落とし込むのに対し、
Dim PicBmp As Bitmap & PicBmp = PicBox.ImageでBitmapを作る方法は
Bitmapクラスとしてのデータ域を新たにメモリ上に確保はせず、
メモリ上に既存のイメージデータ域への参照情報だけをセット
(VB的に言えばByRefでつないでいるイメージ)
しているのではなかろうか。
たとえて言うなら以下のようになっていると思われる。
まず、“PicBox.Image”という家が建っている時に
「同じ家が欲しい」
と“PicBmp”さんが思って、業者のVB.netにコレを発注するとしよう。
この時、“Dim PicBmp As New Bitmap(PicBox.Image)”の注文書を書くと
業者は家を新築してくれるのではあるが、出来上がるのは全く同じ家ではない。
「後々便利に使えることもあるでしょうからαチャンネルも付けときました」
と、RGB3階建てのPicBox.Image家に対してARGB4階建ての家を建ててしまう。
PicBmp家が支払うメモリコストにはちゃっかりα分も上乗せされているから
RGBの3層しか使わない予定の身としては、有難迷惑となる。
ちなみに、前回のソースから“24bitColor以外は処理中断”させるIF文を外し、
8bitグレイスケールのBMPファイルを読み込ませた場合でも
この手法では32bit ARGBのBitmapクラスになる。
平屋建てのつもりが4階建てで、コストは予算の4倍だからびっくりだ!
そうは言っても、この物件はPicBmp家の持ち家なのでDispose宣言して
自由に不動産屋のGarbageコレクションに売りに出せる。
(売れれば割高だったコストもそっくり回収できる)
では、“Dim PicBmp As Bitmap & PicBmp = PicBox.Image”で注文書を書くと
今度はPicBox.Image家と全く同じ家が手に入る。
同じなのもそのはずで、この家は新築したものではなく、
実はPicBox.Image家にPicBmp家用の玄関を勝手に付けただけの
シェアハウスになっていて、実態は同じひとつの家だからだ。
(当然、コストは超激安)
PicBox.Image家にとって困るのは、PicBmp家が行なったリフォームを
受け入れざるを得ないこと。
だからPicBmp家が部屋の天地をひっくり返してしまうと
PicBox.Image家の天地もひっくり返る。
さらにPicBox.Image家が当惑するのはPicBmp家がDispose宣言した時だ。
PicBmp家が勝手に作った玄関だけを撤去して出て行くのかと思いきや
家を丸ごとGarbageコレクションに売りに出してしまうので
(ここの動作ってオカシイんじゃないのって個人的には思う)
PicBox.Image一家が帰る家がなくなってしまう。
エラーはそうして起きていると思うと合点が行く。
- つづく –