3

VB.NET フォームの個々のピクセルの色を変更するにはどうすればよいですか?

ありがとう。

4

3 に答える 3

2

Winforms の厳しい要件は、Windows が要求するたびにフォームを再描画できる必要があるということです。これは、ウィンドウを最小化して元に戻すと発生します。または、古いバージョンの Windows で別のウィンドウを自分のウィンドウに移動すると、.

したがって、ウィンドウにピクセルを設定するだけでは十分ではありません。ウィンドウが再描画されると、ピクセルがすべて失われます。代わりにビットマップを使用してください。追加の負担は、ユーザー インターフェイスの応答性を維持する必要があるため、ワーカー スレッドで計算を行う必要があることです。BackgroundWorker は、それを正しく行うのに便利です。

これを行う 1 つの方法は、2 つのビットマップを使用することです。1 つはワーカーに入力し、もう 1 つは表示します。たとえば、ピクセルの 1 行ごとに作業中のビットマップのコピーが作成され、それが ReportProgress() に渡されます。その後、ProgressChanged イベントは古いビットマップを破棄し、渡された新しいビットマップを格納し、Invalidate を呼び出して再描画を強制します。

于 2012-04-29T17:16:44.027 に答える
0

これらのリソースが役に立つかもしれません:フォームの背景色を設定する

DeveloperFusion フォーラムピクセル カラーの抽出

于 2012-04-29T16:50:54.203 に答える
0

ここにいくつかのデモコードがあります。ハンスが述べた理由により、再描画が遅い. それを高速化する簡単な方法は、遅延後にビットマップのみを再計算することです。

Public Class Form1

  Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    'create new bitmap

    If Me.ClientRectangle.Width <= 0 Then Exit Sub
    If Me.ClientRectangle.Height <= 0 Then Exit Sub

    Using bmpNew As New Bitmap(Me.ClientRectangle.Width, Me.ClientRectangle.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
      'draw some coloured pixels
      Using g As Graphics = Graphics.FromImage(bmpNew)
        For x As Integer = 0 To bmpNew.Width - 1
          For y As Integer = 0 To bmpNew.Height - 1
            Dim intR As Integer = CInt(255 * (x / (bmpNew.Width - 1)))
            Dim intG As Integer = CInt(255 * (y / (bmpNew.Height - 1)))
            Dim intB As Integer = CInt(255 * ((x + y) / (bmpNew.Width + bmpNew.Height - 2)))
            Using penNew As New Pen(Color.FromArgb(255, intR, intG, intB))
              'NOTE: when the form resizes, only the new section is painted, according to e.ClipRectangle.
              g.DrawRectangle(penNew, New Rectangle(New Point(x, y), New Size(1, 1)))
            End Using
          Next y
        Next x
      End Using
      e.Graphics.DrawImage(bmpNew, New Point(0, 0))
    End Using

  End Sub

  Private Sub Form1_ResizeEnd(sender As Object, e As System.EventArgs) Handles Me.ResizeEnd
    Me.Invalidate() 'NOTE: when form resizes, only the new section is painted, according to e.ClipRectangle in Form1_Paint(). We invalidate the whole form here to form an  entire form repaint, since we are calculating the colour of the pixel from the size of the form. Try commenting out this line to see the difference.
  End Sub

End Class
于 2012-04-30T03:35:50.263 に答える