2011-05-13 59 views
0

我正在處理一些圖像處理和調試我正在覆蓋原始位圖上的顏色。使單個像素無效?

的問題是圖像與SizeMode一個圖片框渲染設置變焦和我每次更新像素實在是太慢了,只是變慢較大PictureBox的是(對於相同尺寸的圖像)

無效我認爲可能會有所幫助的是,如果我只是使已更改的像素無效,但我不知道如何將已更改像素的座標轉換爲控件上呈現的矩形。很明顯,如果圖像被繪製得比原始圖像大,那麼我無效的矩形將會超過一個像素

回答

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

無論如何,您不會看到它在每個像素上都能正常工作,除非您要麼將其投入運行,要麼處理速度相當慢。不要忘記你的顯示器無法每秒更新1000次。 – Mario

+0

當我正在查看我想要調查的區域時,我正在對其進行限制,但當我在查看大圖時,可能需要10分鐘才能到達我感興趣的位置。 –

0

我只是添加一個計時器,每秒觸發30或60次,使整個控件失效。雖然更新可能會稍微有些延遲,但由於顯示器的刷新頻率很可能只有60 Hz,所以您不應該注意到它。

+0

這是假設它可以**每秒失效30次。 –