كيف يمكنني جعل PictureBox يستخدم إعادة تشكيل أقرب جار؟

StackOverflow https://stackoverflow.com/questions/29157

سؤال

أنا أستخدم StretchImage لأن الصندوق يمكن تغيير حجمه باستخدام المقسمات.يبدو أن الوضع الافتراضي هو نوع من التصفية السلسة ذات الخطين، مما يجعل صورتي ضبابية ولها أنماط تموج في النسيج.

هل كانت مفيدة؟

المحلول

كنت بحاجة إلى هذه الوظيفة أيضا.لقد قمت بإنشاء فئة ترث 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);
    }
}

نصائح أخرى

أظن أنه سيتعين عليك إجراء تغيير الحجم يدويًا من خلال فئة الصورة ووظيفة DrawImage والاستجابة لأحداث تغيير الحجم في PictureBox.

لقد أجريت بحثًا على 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);
    }

عند تغيير حجم صورة في .net، يوفر System.Drawing.Drawing2D.InterpolationMode طرق تغيير الحجم التالية:

  • بيكوبيك
  • خطين
  • عالي
  • جودة عالية بيكوبيك
  • جودة عالية
  • قليل
  • اقرب جار
  • تقصير
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top