- 締切済み
グラフィックスの読み取りについて。
Option Strict On 'VisualBasic2008(無料版) Imports System.Drawing.Drawing2D Public Class Form1 Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint Dim myFont As New Font("Arial", 20, FontStyle.Bold) e.Graphics.DrawString("7", myFont, Brushes.Red, 0, 0) End Sub End Class 例えば、こんな感じのプログラムがあるとします。 PictureBox1のサイズは25*25です。 PictureBox1内のグラフィックスの読み取りがしたいのです。 質問__1 ドット単位で625のデータをARGBで読み取り配列に格納したいです。 質問__2 グラフィックスが表示されてる場合は1を代入、表示されてない場合は0を代入、配列に入れたいです。イチゼロデータを作りたいです。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- redfox63
- ベストアンサー率71% (1325/1856)
お示しのコードが Paintイベントだったので動作に支障のないようにして Imageプロパティに設定できる方法を探ったため 前回の回答の内容になっています 別に 引数のe.GraphicsをDisposeするわけではないので問題ありませんよ gを新規で定義しているのはbmpに描画するためです 描画し終わったので gをDisposeして bmpとの接続を切ります Paintイベントではなく Loadイベントなどで行ってもいいですよ Loadイベントの場合は 引数eには Graphicsはありませんので 新規に gなどを定義する必要があります
- redfox63
- ベストアンサー率71% (1325/1856)
描画時に Bitmapを生成したほうが楽に処理できそうですよ Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint if PictureBox1.Image Is Nothing then Dim myFont As New Font("Arial", 20, FontStyle.Bold) dim bmp as new Bitmap( 25, 25 ) dim g as Graphics = Graphics.FromImage(bmp) g.DrawString("7", myFont, Brushes.Red, 0, 0) g.dispose() PictureBox1.Image = bmp end if End Sub といった具合にしておきます 1/0 のデータを取得するには ' ピクチャーボックスのBitmapを取得 dim bmp as Bitmap = PictureBox1.Image ' 生データの取得準備 dim bmpData as Drawing.Imaging.BitmapData = _ bmp.LockBits(New Rectangle(0, 0, 25, 25), Imaging.ImageLockMode.ReadWrite, _ bmp.PixelFormat) ' データ長の計算 RGBAで取得なので *4 dim nLen as Integer = Bmp.Width * bmp.Height * 4 dim arData( nLen - 1 ) as byte Runtime.InteropServices.Marshal.Copy(bmpData.Scan0, arData, 0, nLen) bmp.UnlockBits( bmpData ) ' 0/1用のデータ配列 dim arBW( nLen / 4 -1 ) as Byte for n as Integer = 1 to nLen step 4 arBW(n / 4) = (arData(n) = 255) next といった具合でしょう
補足
まだコードは試していません。 気になる点について。 1 Paintイベント内でdisposeを使用しても良いのですか? 2 なぜ?eのとこをgにする必要があるのですか? 初心者なので。