みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

グラフィックスの読み取りについて。

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を代入、配列に入れたいです。イチゼロデータを作りたいです。
よろしくお願いします。

投稿日時 - 2009-08-12 12:37:45

QNo.5201391

暇なときに回答ください

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

お示しのコードが Paintイベントだったので動作に支障のないようにして Imageプロパティに設定できる方法を探ったため 前回の回答の内容になっています

別に 引数のe.GraphicsをDisposeするわけではないので問題ありませんよ

gを新規で定義しているのはbmpに描画するためです
描画し終わったので gをDisposeして bmpとの接続を切ります

Paintイベントではなく Loadイベントなどで行ってもいいですよ
Loadイベントの場合は 引数eには Graphicsはありませんので
新規に gなどを定義する必要があります

投稿日時 - 2009-08-13 03:58:16

ANo.1

描画時に 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
といった具合でしょう

投稿日時 - 2009-08-12 16:36:32

補足

まだコードは試していません。
気になる点について。
1 Paintイベント内でdisposeを使用しても良いのですか?
2 なぜ?eのとこをgにする必要があるのですか?
初心者なので。

投稿日時 - 2009-08-12 22:41:18