2008-08-26 9 views
17

私はStretchImageを使用しています。なぜなら、ボックスはスプリッタでリサイズできるからです。デフォルトは平滑な双線形フィルタリングのようなもので、画像がぼやけてモアレのパターンになっているようです。PictureBoxで最近傍リサンプリングを使用するにはどうすればよいですか?

+1

ので、これを行うには実際に方法はありませんか?いくつかの簡単な方法で? – Luiscencio

+0

@ルシエンシオ:それはそれがどのように見えるかです。適切なサイズの新しいビットマップとそれからGraphics.DrawImage –

+0

であなた自身で行う必要があります.Jyeltonの答えに印を付ける必要があります。 :) – Pedro77

答えて

24

役立ちますまた、私は、ピクチャボックスを継承するクラスを作っ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); 
    } 
} 
+0

とてもいいです。私はEmguCVのPanAndZoomPictureBoxは同じことをすると思います。パフォーマンス上の問題があることは承知していますか? – Pedro77

+0

私は、このようにして補間モードを変更しても、測定可能な性能差はありませんでした。 – JYelton

+0

ハムは良いです。 Jared Updikeはあなたの答えをマークしてください! :) – Pedro77

5

ImageクラスとDrawImage関数を使用して手動でサイズ変更を行い、PictureBoxのresizeイベントに応答する必要があると思われます。

0

.NETで画像をリサイズ、System.Drawing.Drawing2D.InterpolationModeは、以下のリサイズ方法施設:

  • バイキュービック
  • バイリニアを
  • HighQualityBicubic
  • HighQualityBilinear
  • Low
  • NearestN eighbor
  • デフォルト
+0

私はOPの質問にどのように対処しているのかわかりません。 – JYelton

3

は、私は、MSDNの検索を行なったし、非常に詳細ではありませんが、あなたがペイントイベントを使用する必要があることを概説し、この上の記事は、ありますが判明しました。

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); 
    } 
+0

picBox_Paint_1メソッドにはどのようなイベントが組み込まれていますか?それはあなたのコードの他の部分にあるでしょう。 –

+0

それはフォームデザイナーコードにあります:this.picBox.Paint + = new System.Windows.Forms.PaintEventHandler(this.picBox_Paint_1); – ardunn

関連する問題