我正在使用 StretchImage,因为该框可以通过拆分器调整大小。看起来默认是某种平滑的双线性过滤,导致我的图像模糊并有莫尔图案。
Jared
问问题
12636 次
4 回答
37
我也需要这个功能。我创建了一个继承 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);
}
}
于 2012-11-20T23:40:08.863 回答
5
我怀疑您将不得不通过 Image 类和 DrawImage 函数手动调整大小,并响应 PictureBox 上的调整大小事件。
于 2008-08-26T23:41:19.593 回答
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);
}
于 2011-02-22T14:21:38.960 回答
-4
在 .net 中调整图像大小时,System.Drawing.Drawing2D.InterpolationMode 提供以下调整大小方法:
- 双三次
- 双线性
- 高的
- 高品质双三次
- 高质量双线性
- 低的
- 最近的邻居
- 默认
于 2008-08-26T23:47:17.583 回答