Сведения о вопросе

Gaukhar

22:18, 17th August, 2020

Теги

c#   .net   winforms   gdi+   picturebox    

Как сделать так, чтобы PictureBox использовало пересчет ближайших соседей?

Просмотров: 477   Ответов: 4

Я использую StretchImage, потому что коробка может быть изменена с помощью сплиттеров. Похоже, что по умолчанию используется какая-то гладкая билинейная фильтрация, в результате чего мое изображение становится размытым и имеет муаровые узоры.



  Сведения об ответе

прога

21:08, 29th August, 2020

Мне тоже нужна была эта функциональность. Я создал класс, который наследует 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);
    }
}


  Сведения об ответе

+-*/

13:50, 5th August, 2020

Я подозреваю, что вам придется сделать изменение размера вручную через класс Image и функцию DrawImage и реагировать на события изменения размера на PictureBox.


  Сведения об ответе

davran

08:14, 14th August, 2020

Я сделал поиск 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);
    }


  Сведения об ответе

prince

02:28, 19th August, 2020

При изменении размера изображения в .net, System.Drawing.Drawing2D.InterpolationMode предлагает следующие методы изменения размера:

  • Бикубический
  • Билинейный
  • Высокий
  • HighQualityBicubic
  • HighQualityBilinear
  • Низкий
  • NearestNeighbor
  • По умолчанию


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться