كيف يمكنني جعل PictureBox يستخدم إعادة تشكيل أقرب جار؟
-
09-06-2019 - |
سؤال
أنا أستخدم 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 طرق تغيير الحجم التالية:
- بيكوبيك
- خطين
- عالي
- جودة عالية بيكوبيك
- جودة عالية
- قليل
- اقرب جار
- تقصير