我在一个pictureBox中放大/缩小图像,但是如何避免图像变形?

时间:2013-12-05 08:24:28

标签: c# winforms

在form1的顶部我做了:

double increment = 25;

然后:

void pictureBox1_MouseHover(object sender, EventArgs e)
        {
            pictureBox1.Focus();
        }

        void pictureBox1_MouseWheel(object sender, MouseEventArgs e)
        {
            double factor = 1.0;
            if (e.Delta > 0)
                factor += (increment / 100.0);
            else
                factor -= (increment / 100.0);
            pictureBox1.Image = resizeImage(pictureBox1.Image, new Size((int)(pictureBox1.Image.Width * factor), (int)(pictureBox1.Image.Height * factor)));

        }

        public static Image resizeImage(Image imgToResize, Size size)
        {
            return (Image)(new Bitmap(imgToResize, size));
        }

它的工作但有两个问题:

  1. 如果您将尺寸增加25%,然后减少25%,则无法恢复您开始使用的尺寸。例如,100 + 25%= 125,125 -25%= 94(因为100的25%是25,但125的25%是31)。通过如何增加/减少呢?我如何将其限制为最小和最大尺寸?

  2. 如果我不断增加和减小尺寸,图片迟早会变形。我该如何避免这种情况?

2 个答案:

答案 0 :(得分:1)

  • 用乘法/除法(1 * 1.25 = 1.25,1.25 / 1.25 = 1)代替加法/减法,例如:

    double increment = 1.25;   
    double factor = 1.0;
    if (e.Delta >  0)
        factor *= increment;
    else
        factor /= increment;
    
  • 问题是您是基于先前生成的图像而不是原始图像生成图像的新版本。如果降低某些图片的分辨率,则会丢失一些信息。这是一个单向的过程。换句话说,你不能减少图像然后增加它,并期望结果与原始图像相同。我认为你应该始终将原始图像传递给resizeImage方法。原始图像可以存储在一个字段中,也可以每次从资源或文件中读取。

  • 在将新图像分配给 pictureBox1.Image 之前,您应该处理旧图像。

答案 1 :(得分:0)

您可能需要考虑在鼠标悬停时显示不同的较大版本的图像,而不是放大相同的图像。