我使用鼠标滚轮放大/缩小图片框中的图像:
在form1的顶部:
double increment = 1.25;
double factor = 1.0;
Image img;
在构造函数中:
img = new Bitmap(@"d:\radar000075.png");
pictureBox1.Load(@"d:\radar000075.png");
然后两个事件并重新调整方法:
void pictureBox1_MouseHover(object sender, EventArgs e)
{
pictureBox1.Focus();
}
void pictureBox1_MouseWheel(object sender, MouseEventArgs e)
{
if (e.Delta > 0)
factor *= increment;
else
factor /= increment;
pictureBox1.Image = resizeImage(img, new Size((int)(img.Width * factor), (int)(img.Height * factor)));
}
public static Image resizeImage(Image imgToResize, Size size)
{
return (Image)(new Bitmap(imgToResize, size));
}
现在它的工作没有任何问题但是:
在鼠标滚轮事件中,我分配给pictureBox.Iamge每次原始图像并使用resizeImage方法。每次原始图像(img)我都需要处理吗?或者我以某种方式指定的旧图像?
我如何以及在何处设置图像大小的限制现在它将图像的大小调整为小或大25%但是应该有一个限制我可以放大多大,以及我可以缩小到哪里和我该如何设置此限制?
答案 0 :(得分:0)
Bitmap
实现IDisposable
界面,是的,从技术上讲,一旦你完成使用它就应该处理掉它。否则将由垃圾收集器执行此操作,您永远不知道它何时会触发。因此,如果您因为每次都要创建的新位图而大量调整大小,您可能会看到内存消耗量上下波动。
对于因子限制,我个人从pictureBox1_MouseWheel
中提取当前因子计算代码并将其添加到新方法中。关于调整大小的事情并不是真正的事件业务所以它应该是一个单独的方法(你应该看看Single Responsibility Principle)。只需在您已经存在的情况下添加其他条件即可轻松完成工作。它可能是这样的:
void pictureBox1_MouseWheel(object sender, MouseEventArgs e)
{
CalculateNewSizeFactor(e.Delta);
pictureBox1.Image = resizeImage(img, new Size((int)(img.Width * factor), (int)(img.Height * factor)));
}
private void CalculateNewSizeFactor(int delta)
{
if (delta > 0 && factor < 2)
{
factor *= increment;
}
else if (delta < 0 && factor > 0.25)
{
factor /= increment;
}
}
基本上,只有当因子小于,比如2,大于0.25时才会调整大小。
另外,这里有一些针对您的代码的快速建议:
resizeImage
应为ResizeImage
。img
已在类级别声明,您无需将其作为参数传递给resizeImage static
修饰符。所以你的方法可以简化为
public Image ResizeImage(Size size)
{
return new Bitmap(img, size);
}