代码之家  ›  专栏  ›  技术社区  ›  Jared Updike

如何使PictureBox使用最近邻重采样?

  •  31
  • Jared Updike  · 技术社区  · 17 年前

    我使用StretchImage是因为该框可以使用拆分器调整大小。看起来默认值是某种平滑的双线性滤波,导致我的图像模糊并有莫尔图案。

    4 回复  |  直到 17 年前
        1
  •  38
  •   JYelton Melchior Blausand    7 年前

    我也需要这个功能。我创建了一个继承PictureBox的类,重写 OnPaint 并添加允许设置插值模式的属性:

    using System.Drawing.Drawing2D;
    using System.Windows.Forms;
    
    /// <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);
        }
    }
    
        2
  •  5
  •   Joel Lucsy    17 年前

    我怀疑你必须通过Image类和DrawImage函数手动调整大小,并响应PictureBox上的调整大小事件。

        3
  •  3
  •   Alex D    15 年前

    我在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);
        }
    
        4
  •  -4
  •   GateKiller    17 年前

    在.net中调整图像大小时,系统。绘图。绘图2D。InterpolationMode提供以下调整大小的方法:

    • Bicubic
    • 双线性
    • 高的
    • 高品质双立方
    • 高品质双线性
    • 低的
    • 最近的邻居
    • 不履行