0

このforループでバックグラウンドワーカーを使用するにはどうすればよいですか?

int tmax = 10;
int xmax = newbitmap.Width;
int ymax = newbitmap.Height;
for (int t = 0; t <= tmax; t += 1)
{
  for (int x = 0; x < xmax; x++)
  {
    for (int y = 0; y < ymax; y++)
    {
      if ((x / xmax) > (t / tmax))
      {
        Color originalco = newbitmap2.GetPixel(x, y);
        outp.SetPixel(x, y, originalco);
      }
      else
      {
        Color originalco3 = newbitmap.GetPixel(x, y); ;
        outp.SetPixel(x, y, originalco3);
      }

    }

    pictureBox1.Image = outp;
  }
}

このループは右から左へのワイプトランジションですが、トランジションは表示されません。

4

4 に答える 4

3

これは、backgroundWorker が別のスレッドで動作するためです。使用できますbackgroundworker.ReportProgress(0, outp)

BackgroundWorker.ProgressChangedそのため、Vistual Studio のイベント ウィンドウから、または次の行を使用してイベントに登録する必要があります。

backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);

メソッド:

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        var outp = (Bitmap)e.UserState;
        prictureBox.Image = outp;
    }

あなたのコードは次のようになります:

        int tmax = 10;
        int xmax = newbitmap.Width;
        int ymax = newbitmap.Height;
        for (int t = 0; t <= tmax; t += 1)
        {

            for (int x = 0; x < xmax; x++)
            {
                for (int y = 0; y < ymax; y++)
                {
                    if ((x / xmax) > (t / tmax))
                    {
                        Color originalco = newbitmap2.GetPixel(x, y);
                        outp.SetPixel(x, y, originalco);
                    }
                    else
                    {
                        Color originalco3 = newbitmap.GetPixel(x, y); ;
                        outp.SetPixel(x, y, originalco3);
                    }

                }

                backgroundWorker1.ReportProgress(t, outp);

            }
        }
于 2012-07-11T08:47:45.153 に答える
1

バックグラウンド ワーカーのメソッドを使用しReportProgressて UI を更新できます。

続きを読む

于 2012-07-11T09:19:16.600 に答える
1

まず、ここで説明されているように、直接ピクセル操作を使用する必要があります: http://msdn.microsoft.com/en-us/library/5ey6h79d.aspx

次に、線がすでに描画されているスレッドと描画されていないすべてのスレッドのルックアップとして配列を使用する必要があります。スレッドは、この配列で新しい行を探し、それを描画します。ただし、ルックアップ配列をロックすることを忘れないでください。

于 2012-07-11T08:48:30.740 に答える
1

Do work メソッドは次のようになります。

private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
     Bitmap newbitmap = (Bitmap)e.Argument;

     int tmax = 10;
     int xmax = newbitmap.Width;
     int ymax = newbitmap.Height;
     for (int t = 0; t <= tmax; t += 1)
     {

         for (int x = 0; x < xmax; x++)
         {
              for (int y = 0; y < ymax; y++)
              {
                   if ((x / xmax) > (t / tmax))
                   {
                       Color originalco = newbitmap2.GetPixel(x, y);
                       outp.SetPixel(x, y, originalco);
                   }
                   else
                   {
                       Color originalco3 = newbitmap.GetPixel(x, y); ;
                       outp.SetPixel(x, y, originalco3);
                   }

               }
               pictureBox1.Image = outp;
         }
      }
      bgWorker.ReportProgress(0,outp);
}

その後、ワーカーが進行状況を報告すると、UI を安全に更新できる次のイベントが発生します。

private void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    //UPDATE YOUR UI HERE
}
于 2012-07-11T09:02:22.430 に答える