' InitializeComponent() 呼び出しの後で初期化を追加します。 With Me .Width = X / 2 .Height = Y / 2 .MaximizeBox = False .MinimizeBox = False End With BMP = New Bitmap(X, Y, System.Drawing.Imaging.PixelFormat.Format24bppRgb) ' PBox =>PictureBox With Pbox .Width = BMP.Width / 2 .Height = BMP.Height / 2 .Location = New Point(0, 0) .Image = BMP End With End Sub Public Sub SetBMP(ByRef BMPBuff() As Byte) Dim BD As Imaging.BitmapData
' Lock BD = BMP.LockBits(New Rectangle(0, 0, BMP.Width, BMP.Height), Imaging.ImageLockMode.WriteOnly, BMP.PixelFormat) Dim bp As System.IntPtr bp = BD.Scan0 ' ポインタの取得 Copy(BMPBuff, 0, bp, BMPBuff.Length - 1) BMP.UnlockBits(BD) End Sub Private Sub Pbox_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Pbox.Paint Debug.WriteLine("Call") If Not (BMP Is Nothing) Then e.Graphics.DrawImage(BMP, 0, 0, CInt(BMP.Width / 2), CInt(BMP.Height / 2)) End If End Sub
分類:[.NET]
【解決したい問題】
複数レイヤの画像データを含んでいるデータを分解し、各レイヤの画像を表示させようとしています。
データの分解と、各レイヤへの分離及び表示には成功しました。
これを、複数のデータで行おうとした際に問題が起こりました。
複数レイヤの表示は、Pictureboxを含むフォームを配列で保持し、同時に表示させました。
' PForm() はフォームの配列です
For _R As Integer = 0 To iR - 1
PForm(_R) = New Picture(iX, iY)
PForm(_R).Show()
Next
表示後、下記の方法でレイヤ毎に分解した画像データを渡します
'BMPBuffは各レイヤの画像データ
PForm(_R).SetBMP(BMPBuff)
ここで、PFormは下記の通りです
Public Class Picture
Dim BMP As Bitmap
Public Sub New(ByVal X As Integer, ByVal Y As Integer)
' この呼び出しは、Windows フォーム デザイナで必要です。
InitializeComponent()
' InitializeComponent() 呼び出しの後で初期化を追加します。
With Me
.Width = X / 2
.Height = Y / 2
.MaximizeBox = False
.MinimizeBox = False
End With
BMP = New Bitmap(X, Y, System.Drawing.Imaging.PixelFormat.Format24bppRgb)
' PBox =>PictureBox
With Pbox
.Width = BMP.Width / 2
.Height = BMP.Height / 2
.Location = New Point(0, 0)
.Image = BMP
End With
End Sub
Public Sub SetBMP(ByRef BMPBuff() As Byte)
Dim BD As Imaging.BitmapData
' Lock
BD = BMP.LockBits(New Rectangle(0, 0, BMP.Width, BMP.Height), Imaging.ImageLockMode.WriteOnly, BMP.PixelFormat)
Dim bp As System.IntPtr
bp = BD.Scan0 ' ポインタの取得
Copy(BMPBuff, 0, bp, BMPBuff.Length - 1)
BMP.UnlockBits(BD)
End Sub
Private Sub Pbox_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Pbox.Paint
Debug.WriteLine("Call")
If Not (BMP Is Nothing) Then
e.Graphics.DrawImage(BMP, 0, 0, CInt(BMP.Width / 2), CInt(BMP.Height / 2))
End If
End Sub
1つのデータを読み込み、分解し、表示させることはできたのですが、これを連続して行うと、PictureBoxの表示が更新されません。
データ取得→分解→画像表示を連続で行うためにはどうすればよいのでしょうか?
【解決するために何をしたか】
ひとまず、Pbox_Paintが呼ばれているかDebugメッセージを確認しながら、PFormに画像データを渡したあとに、PFormにフォーカスをあてたり、Activateしたりしました。
結果、最後のデータを処理した後に呼ばれていますが、それまでは1度も呼ばれていませんでした。