2011-05-13 3 views
0

私はいくつかの画像処理に取り組んでおり、デバッグのために元のビットマップに色を重ねています。1つのピクセルを無効にしますか?

問題は、画像をズームに設定され、Iはピクセルを更新するたびに無効化することは非常に遅くなるだけ大きいピクチャが(同じサイズの画像の場合)

で遅くなるのSizeModeとピクチャボックスにレンダリングされ私が変更したピクセルだけを無効にしても、私が変更したピクセルの座標をコントロール上でレンダリングされた矩形に変換する方法がわかりません。明らかに画像が元の画像より大きく描かれている場合、無効化している矩形は複数のピクセルになる可能性があります

答えて

1

は、このような無効化と呼ばれるピクセルを無効にするために、その後

private void CalculateZoomAndPadding() 
    { 
     Double imageAspect = (Double)pictureBox1.Image.Width/(Double)pictureBox1.Image.Height; 
     Double pbAspect = (Double)pictureBox1.Width/(Double)pictureBox1.Height; 
     Boolean heightRestricted = imageAspect < pbAspect; 
     hPadding = 0; 
     vPadding = 0; 
     if (heightRestricted) 
     { 
      zoom = (Double)pictureBox1.Height/(Double)pictureBox1.Image.Height; 
      Double imageWidth = (Double)pictureBox1.Image.Width * zoom; 
      hPadding = (Double)(pictureBox1.Width - imageWidth)/2d; 
     } 
     else 
     { 
      zoom = (Double)pictureBox1.Width/(Double)pictureBox1.Image.Width; 
      Double imageHeight = (Double)pictureBox1.Image.Height * zoom; 
      vPadding = (Double)(pictureBox1.Height - imageHeight)/2d; 
     } 
    } 

画像痘のズームやパディングを取得するメソッドを追加しました:

pictureBox1.Invalidate(new Rectangle(Convert.ToInt32(Math.Floor(x * zoom)) + Convert.ToInt32(hPadding) -1, Convert.ToInt32(Math.Floor(y * zoom)) + Convert.ToInt32(vPadding) -1, PixelSize, PixelSize)); 

私が最初にこれをしたとき、私は唯一の無効ピクセルで直接覆われていますが、これが丸め誤差の対象となっていることがわかりましたので、いくつかの余分な部分が含まれています。

1

すべてのピクセルを変更して一度無効にすることはできますか?

+0

このようにして、画像処理が各ピクセルでどのように機能しているのか分かりませんが、完成した製品を取得するのではなく、完成した製品のみを取得します。 –

+0

あなたはそれをスローダウンしていないか、いずれにしても処理が遅い場合を除き、すべてのピクセルで動作するとは限りません。あなたのモニターは1秒間に1000回更新できないことを忘れないでください。 – Mario

+0

調査したい地域を見ているときに絞り込んでいますが、大きな画像を見ていると興味のあるところに行くのに10分かかることがあります。 –

0

私は、コントロール全体を無効にする1秒間に30回または60回起動するタイマーを追加するだけです。更新に若干の遅れがあるかもしれませんが、おそらくモニターのリフレッシュレートがおそらく60 Hzのみであるため、気付くことはできません。

+0

これは、** 1秒間に30回無効にすることができると仮定しています。 –

関連する問題