Изменение размера изображения с помощью перетаскивания мышью (C #) - PullRequest
1 голос
/ 21 марта 2010

У меня возникли проблемы с изменением размера изображения простым перетаскиванием мыши.Я нашел метод среднего изменения размера и сейчас пытаюсь изменить его, чтобы использовать мышь вместо заданных значений.

То, как я это делаю, имеет смысл для меня, но, возможно, вы, ребята, можете дать мне несколько лучших идей.Я в основном использую расстояние между текущим положением мыши и предыдущим положением мыши в качестве коэффициента масштабирования.Если расстояние между текущим местоположением мыши и центром изображения меньше, чем расстояние между предыдущим местоположением мыши и центром изображения, тогда изображение уменьшается, и наоборот.

С кодомниже я получаю исключение аргумента (недопустимый параметр) при создании нового растрового изображения с новой высотой и шириной, и я действительно не понимаю, почему ... какие-либо идеи?

---------------------------------РЕДАКТИРОВАТЬ------------------------------------------------------

Хорошо, благодаря Aaronaught проблема исключений была исправлена, и яобновил код ниже.Теперь у меня возникла проблема с тем, чтобы изменение размера выглядело плавно, и я нашел способ не дать ему искажаться до такой степени, что вы не сможете распознать изображение после многократного изменения его размера.искажение - это изменение его на исходное изображение, когда оно находится в определенном диапазоне размеров;но я не слишком уверен, как бы я справился с этой работой, чтобы она не выглядела странно.Вот обновленный код:

private static Image resizeImage(Image imgToResize, System.Drawing.Point prevMouseLoc, System.Drawing.Point currentMouseLoc)
    {
        int sourceWidth = imgToResize.Width;
        int sourceHeight = imgToResize.Height;
        float dCurrCent = 0;
        float dPrevCent = 0;
        float dCurrPrev = 0;
        bool increase = true;
        System.Drawing.Point imgCenter = new System.Drawing.Point();
        float nPercent = 0; 

        imgCenter.X = imgToResize.Width / 2;
        imgCenter.Y = imgToResize.Height / 2;

        // Calculating the distance between the current mouse location and the center of the image
        dCurrCent = (float)Math.Sqrt(Math.Pow(currentMouseLoc.X - imgCenter.X, 2) + Math.Pow(currentMouseLoc.Y - imgCenter.Y, 2));

        // Calculating the distance between the previous mouse location and the center of the image
        dPrevCent = (float)Math.Sqrt(Math.Pow(prevMouseLoc.X - imgCenter.X, 2) + Math.Pow(prevMouseLoc.Y - imgCenter.Y, 2));

        // Setting flag to increase or decrease size
        if (dCurrCent >= dPrevCent)
        {
            increase = true;
        }
        else
        {
            increase = false;
        }

        // Calculating the scaling factor
        dCurrPrev = nPercent = (float)Math.Sqrt(Math.Pow(currentMouseLoc.X - prevMouseLoc.X, 2) + Math.Pow(currentMouseLoc.Y - prevMouseLoc.Y, 2));

        if (increase)
        {
            nPercent = (float)dCurrPrev;
        }
        else
        {
            nPercent = (float)(1 / dCurrPrev);
        }

        // Calculating the new height and width of the image
        int destWidth = (int)(sourceWidth * nPercent);
        int destHeight = (int)(sourceHeight * nPercent);

        // Create new bitmap, resize image (within limites) and return it
        if (nPercent != 0 && destWidth > 100 && destWidth < 600)
        {
            Bitmap b = new Bitmap(destWidth, destHeight);
            Graphics g = Graphics.FromImage((Image)b);
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;

            g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
            g.Dispose();

            return (Image)b;
        }
        else
            return imgToResize;
    }

Ответы [ 2 ]

1 голос
/ 21 марта 2010

Чтобы свести к минимуму искажения, вам необходимо выяснить разницу между фактическим размером изображения и новым размером изображения и всегда создавать измененное изображение из исходного изображения.Всякий раз, когда размер изображения изменяется, вызывайте Refresh на элементе управления, на котором вы рисуете изображение.

Кстати, элемент управления PictureBox с SizeMode, установленным на PictureBoxSizeMode.Zoom, может обрабатывать изображениеизменение размера для вас.Для изменения размера вашего кода потребуется только изменение размера PictureBox.(Конечно, может не иметь смысла использовать элемент управления в вашей ситуации, но я подумал, что дам вам знать на всякий случай).

0 голосов
/ 21 марта 2010

Что произойдет, если мышь вообще не двигается? Вы не рассматриваете случай, когда nPercent оценивается как 0.

Если вы попытаетесь создать Bitmap с нулевой высотой и шириной, это исключение, которое вы получите.

...