【STA】RTKデータ解析用グラフィック機能開発ーその2ー<ソースBITMAP表示基礎>

PictureBoxとBitmap,Graphicsの関係の基本を理解して、ソースBITMAPから切り取ってPictureBoxへ表示する基本を備忘録します。

※グラフィック備忘録 本記事では②を使ってます。①はリアルタイム表示用です。
①PictureBoxとBitmapを定義してしまう場合
参考LINK PictureBox.Imageプロパティに設定している画像を描き変えた時、すぐに表示に反映する 
PictureBoxは、額縁に相当します。額縁に差し込む絵は、紙であるBitmapオブジェクトです。

 Bitmapに描画するには、それぞれのBitamap専用のグラフィック処理クラス graphicsを定義します。 
 Dim bmp as new Bitmap(PictureBox1.Width,PictureBox1.Height)’bmpオブジェクトを定義
 Dim g as Graphics =Graphics.FromImage(bmp)’bmpのグラフィクス処理を定義
 g.DrawLine(Pens Red,x0,y0,x1,y1)’ bmpビットマップへ線が描画されてPictureBoxに反映

②PictureBoxとは独立させてBitmapを処理するしてからPictureBoxに反映させる場合
(参考https://dobon.net/vb/dotnet/graphics/createimage.html )

 Dim bmp as new Bitmap(1000,400)’1000×400にビットマップを定義
   Dim g as Graphics =Graphics.FromImage(bmp)’bmpのグラフィクス処理を定義
 g.DrawLine(Pens Red,x0,y0,x1,y1)’ bmpビットマップへ線が描画する
 PictureBox1.Image=bmp ‘bmpをPictureBox1へ差し込む
 この場合ビットマップに各種処理をした後で、PictureBox表示できるので、便利です。

 RTKデータ解析用グラフィック機能開発ーその1ー<自動追尾機能便利>
RTKデータ解析用グラフィック機能開発ーその2ー<ソースBITMAP表示基礎>
RTKデータ解析用グラフィック機能開発ーその3ー<自動追尾機能の中身>

RTKデータ解析用グラフィック機能開発ーその4ー<ターンの解析手法

RTKデータ解析用グラフィック機能開発ーその5ー<8か月の集大成>

※BITMAPへの描画できる方を前提に解説してますが、作り方の備忘録しておきます。

’Class直下にbitmapの定義をしておきます。
Public bmap1 As Bitmap ‘ソースデータ画像’プロットするSub内でgraphicsとbitmap定義してbitmapへ描画記録します。bmap1 = New Bitmap(bmp1X, bmp1Y)
Dim g1 As Graphics = Graphics.FromImage(bmap1) ’g1はbmap1用のグラフィック処理名’サイズ10×10の円をを描く
g1.FillEllipse(Brushes.Aqua, pxb2, pyb2, 10, 10)
g1.FillEllipse(Brushes.Yellow, pxr2, pyr2, 10, 10)
’描画が終わるとbmap1メモリーの記録されるので、g1を開放してもよい
g1.Dispose()
’これで、Bitmapは出来上がり

’別のSubでbmap1を切り取って、bmap2としてPictureBox1へ書き込むには
PictureBox1.Image = bmap2

スキーターンアナライザのメインプログラム長くて難解ですが、一応備忘録しておきます。
https://gist.github.com/dj1711572002/026be939156dfa5b53b813bc9d3e26ac

●PictureBoxの基本
PictureBoxは、額縁であるという概念です。額縁なので、どこかで描いた絵を差し込んで使う(B)の普通ですが
額縁に白い紙を差し込んでおいて、描画する方法(A)だと即時反映されるのですが毎回DISPLAYをいじるので全体的に速度遅くなります。

上図の文章だけTEXT BOXに残しておきます。

  • PictureBoxコントロールは、額縁と同じもの

①幅Widthと高さHeight

②差し込む絵は自由だが、幅、高さに切り取られる

Displayへ表示するには、PictureBox.Imageプロパティに差し込む画素データ名を入れる。Bitmap形式が多いが、gif,jpg,pngでも表示可能


PictuteBoxへ画像の差し込み方法2つ、は遅い は応用範囲広く、高速。


A:額縁に白い紙を差し込んでから、額縁に描画する方法
PictureBox1.Image=New Bitmap(PictureBox1.Width,PictureBox1.Heght)
額縁自体に書きんだ瞬間に表示されるが再度この行を通過するRESETされるので、初回だけ宣言するようにif で保護
if    PictureBox1.Image= Nothing     then
PictureBox1.Image=New Bitmap(PictureBox1.width,PictureBox1.Heght)
End if

とすれば、書かれた図形は、残るが、この方法は、毎回Displayへ描画するので速度が遅くなる欠点がある。
消す場合は、PictureBox1.Image=Nothingで全部消える

B:額縁にソースのBITMAPから切り取った差し込み用BITMAPを差し込む。Bitmapメモリー書き込みなので高速
ソースBitmapの定義
Dim sourceBitmap as  New Bitmap(16000,9000)‘ ソースBitmapは最大サイズ2GBまで

差し込みBitmapの定義
Dim  trimmedBitmap as New Bitmap(PictureBox1.Width、PictureBox1.Height)‘PictureBox1と同じサイズ

ソースの切り取り矩形と額縁に差し込む矩形の定義=>矩形構造体Rectangle(原点X,原点Y,幅、高さ)
 Dim  srcRect as Rectangle(X,Y,PictureBox1.Width,PictureBox1.Height)ソースBitamapからX,Yだけ原点をオフセットして切り取った例
 Dim  destRect as Rectangle(0,0,PictureBox1.Width,PictureBox1.Height) 切り取った画像と同じサイズで原点からプロットする例


’切り取り処理はGraphics命令を使う
Dim g2=Graphics.FromImage(TrimmedBitmap)  ‘g2描画命令は、TrimmedBitmap上へ描画される宣言

‘DrawImage命令でソースBitamapから切り取った画像をtrimmedBitmapへ書き込む

g2.DrawImage(sourceBitmap,destRect,srcRect,GraphicsUnit.Pixel)  このg2命令で書き込み結果は、trimmedBitmapへピクセル単位で書き込まれる


’最後にPictureBox1trimmedBitmapを差し込んでDisplayへ一括表示して完成

PictureBox1.Image=trimmedBitamap

 

●ソースBITMAPと差し込みBITMAPの図解

大きなBITMAPへ全データを書き込んで保持しておきます。こうすることで過去データを一瞬で表示したり、現在のデータの値によって動的トリミングしてグラフ全体を動かすことが
できます。

●BITMAPのサイズ制限
.NETのBitamapクラスでは4バイトの整数を使っているので、整数の上限までしか使えません。4byte=2,147,483,647=2147MBですが
 実際は、プログラムの変数宣言などメモリー使っているので、私のプログラムでは1.2GB以下のBITMAPしか使えませんでした。

●描画は、Graphicsで指定します。
DOBON.NET様の解説が判り易いです。線と丸と四角で描画できます。
グラフィックの一覧 https://dobon.net/vb/dotnet/graphics/index.html

線: https://dobon.net/vb/dotnet/graphics/drawline.html
四角 丸:https://dobon.net/vb/dotnet/graphics/drawrectangle.html

 

●切り取りの学習プログラム
こちらの記事で解説してあります

【VB.NET】グラフの一部を切り取って高速表示する<dobon.net様に感謝>

●切り取って、回転移動させて表示する学習プログラム

【VB.NET】画像を自由変形して回転、平行移動<DrawImageを使う>

 

 

●以後
次回その3で、動的な切り取りのやり方を実際のプログラムで解説します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です