我正在尝试制作一个可以放大和缩小图片框中图片的轨迹栏。这是我目前的代码:
namespace Zoom_in_and_Out_Tool
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private Image imgOriginal;
private void Form1_Load(object sender, EventArgs e)
{
// set image location
imgOriginal = Image.FromFile(@"C:\New Folder\picture1.jpg");
picBox.Image = imgOriginal;
// set Picture Box Attributes
picBox.BackgroundImageLayout = ImageLayout.Stretch;
// set Slider Attributes
zoomSlider.Minimum = 1;
zoomSlider.Maximum = 5;
zoomSlider.SmallChange = 1;
zoomSlider.LargeChange = 1;
zoomSlider.UseWaitCursor = false;
// reduce flickering
this.DoubleBuffered = true;
}
public Image PictureBoxZoom(Image img, Size size)
{
Bitmap bm = new Bitmap(img, Convert.ToInt32(img.Width * size.Width), Convert.ToInt32(img.Height * size.Height));
Graphics grap = Graphics.FromImage(bm);
grap.InterpolationMode = InterpolationMode.HighQualityBicubic;
return bm;
}
private void zoomSlider_Scroll(object sender, EventArgs e)
{
if (zoomSlider.Value > 0)
{
picBox.Image = null;
picBox.Image = PictureBoxZoom(imgOriginal, new Size(zoomSlider.Value, zoomSlider.Value));
}
}
}
}
目前它出现了2个问题。一个是它确实想要使用行grap.InterpolationMode = InterpolationMode.HighQualityBicubic进行编译; 。第二个问题是,当我尝试缩放它时会出现错误:“”ArgumentException未处理“行处的错误:位图bm =新位图(img,Convert.ToInt32(img.Width * size.Width),转换.ToInt32(img.Height * size.Height));“任何帮助都会很棒,
由于
更新 第一个错误说:“当前上下文中不存在名称'InterpolationMode'” 我评论此行时的第二个错误是:'NullReferenceException未处理“对象引用未设置为对象的实例。”在线上Bitmap bm = new Bitmap(img,Convert.ToInt32(img.Width * size.Width),Convert.ToInt32(img.Height * size.Height));
由于
答案 0 :(得分:4)
包含
using System.Drawing.Drawing2D;
在您的使用列表中。
第二个错误可能是由于img
为空或size
为空。
答案 1 :(得分:-1)
第一个编译器错误很可能是由对InterpolationMode.HighQualityBicubic
的未知引用引起的。 InterpolationMode
枚举位于Drawing2D
命名空间中,该命名空间是System.Drawing
的子命名空间。
您可以通过为Using
添加额外的System.Drawing.Drawing2D
指令,或者通过在代码中完全限定命名空间来修复此错误:
grap.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic;
您的代码的第二个问题是您指定为此方法(img
)的参数的图像是空引用。一旦创建了控件(在表单的构造函数中),缩放滑块的Scroll
事件可能会被提升,这是在表单的Load
方法中的代码运行之前,这就是创建的图像(通过从磁盘上的文件加载)。
尝试向Scroll
事件处理程序添加空检查:
private void zoomSlider_Scroll(object sender, EventArgs e)
{
if ((zoomSlider.Value > 0) && (imgOriginal != null))
{
picBox.Image = null;
picBox.Image = PictureBoxZoom(imgOriginal, new Size(zoomSlider.Value, zoomSlider.Value));
}
}
最后,我注意到你正在设置图片框的BackgroundImageLayout
属性,但是你发布的代码都没有实际指定图片框的背景图片。您的意思是设置SizeMode
property来调整图像的显示方式吗?类似的东西:
picBox.SizeMode = PictureBoxSizeMode.StretchImage;