我应该如何以及在哪里处理旧图像?以及将图片框中的图像设置为最小和最大的大小?

时间:2013-12-05 21:37:26

标签: c# winforms

我使用鼠标滚轮放大/缩小图片框中的图像:

在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));
        }

现在它的工作没有任何问题但是:

  1. 在鼠标滚轮事件中,我分配给pictureBox.Iamge每次原始图像并使用resizeImage方法。每次原始图像(img)我都需要处理吗?或者我以某种方式指定的旧图像?

  2. 我如何以及在何处设置图像大小的限制现在它将图像的大小调整为小或大25%但是应该有一个限制我可以放大多大,以及我可以缩小到哪里和我该如何设置此限制?

1 个答案:

答案 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时才会调整大小。

另外,这里有一些针对您的代码的快速建议:

  • C#中的方法通常在CamelCase中输入,因此resizeImage应为ResizeImage
  • img已在类级别声明,您无需将其作为参数传递给resizeImage
  • 如果您不打算静态使用此方法,请避免使用static修饰符。
  • 您无需将位图强制转换为图像

所以你的方法可以简化为

public Image ResizeImage(Size size)
{
    return new Bitmap(img, size);
}