2008-08-26 80 views
17

我使用StretchImage,因爲該框可以使用分隔線調整大小。它看起來像默認是某種平滑的雙線性過濾,導致我的圖像模糊,並有波紋圖案。如何使PictureBox使用最近鄰居重採樣?

+1

所以沒有實際的方法來做到這一點?在一些簡單的時尚? – Luiscencio 2010-10-25 20:18:01

+0

@Luiscencio:這就是它的樣子。你必須自己做一個適當大小的新位圖,然後Graphics.DrawImage – 2010-10-25 21:33:55

+0

你應該標記JYelton的答案。 :) – Pedro77 2013-05-30 22:28:20

回答

24

我需要這個功能也。我做了一個繼承PictureBox的類,覆蓋OnPaint,並添加了一個屬性以允許插值模式被設置:

/// <summary> 
/// Inherits from PictureBox; adds Interpolation Mode Setting 
/// </summary> 
public class PictureBoxWithInterpolationMode : PictureBox 
{ 
    public InterpolationMode InterpolationMode { get; set; } 

    protected override void OnPaint(PaintEventArgs paintEventArgs) 
    { 
     paintEventArgs.Graphics.InterpolationMode = InterpolationMode; 
     base.OnPaint(paintEventArgs); 
    } 
} 
5

我懷疑你將不得不手動調整大小,通過Image類和DrawImage函數並響應PictureBox上的調整大小事件。

0

調整時在.NET中的形象,System.Drawing.Drawing2D.InterpolationMode提供了以下調整方法:

  • 雙三次
  • 雙線性
  • HighQualityBicubic
  • HighQualityBilinear
  • NearestN eighbor
  • 默認
+0

我不明白這是如何解決OP的問題。 – JYelton 2012-11-20 23:29:04

3

我做了MSDN搜索和原來有這個的文章,這是不是很詳細,但列出了你應該使用Paint事件。

http://msdn.microsoft.com/en-us/library/k0fsyd4e.aspx

我編輯了常用的圖像縮放例如要使用此功能,請參閱下面

從編輯:http://www.dotnetcurry.com/ShowArticle.aspx?ID=196&AspxAutoDetectCookieSupport=1

希望這有助於

private void Form1_Load(object sender, EventArgs e) 
    { 
     // set image location 
     imgOriginal = new Bitmap(Image.FromFile(@"C:\images\TestImage.bmp")); 
     picBox.Image = imgOriginal; 

     // set Picture Box Attributes 
     picBox.SizeMode = PictureBoxSizeMode.StretchImage; 

     // set Slider Attributes 
     zoomSlider.Minimum = 1; 
     zoomSlider.Maximum = 5; 
     zoomSlider.SmallChange = 1; 
     zoomSlider.LargeChange = 1; 
     zoomSlider.UseWaitCursor = false; 

     SetPictureBoxSize(); 

     // reduce flickering 
     this.DoubleBuffered = true; 
    } 

    // picturebox size changed triggers paint event 
    private void SetPictureBoxSize() 
    { 
     Size s = new Size(Convert.ToInt32(imgOriginal.Width * zoomSlider.Value), Convert.ToInt32(imgOriginal.Height * zoomSlider.Value)); 
     picBox.Size = s; 
    } 


    // looks for user trackbar changes 
    private void trackBar1_Scroll(object sender, EventArgs e) 
    { 
     if (zoomSlider.Value > 0) 
     { 
      SetPictureBoxSize(); 
     } 
    } 

    // redraws image using nearest neighbour resampling 
    private void picBox_Paint_1(object sender, PaintEventArgs e) 
    { 
     e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor; 
     e.Graphics.DrawImage(
      imgOriginal, 
      new Rectangle(0, 0, picBox.Width, picBox.Height), 
      // destination rectangle 
      0, 
      0,   // upper-left corner of source rectangle 
      imgOriginal.Width,  // width of source rectangle 
      imgOriginal.Height,  // height of source rectangle 
      GraphicsUnit.Pixel); 
    }