ASP.NET: логика пропорционального изменения размера изображения - PullRequest
0 голосов
/ 16 июня 2009

У меня есть функция C # для изменения размера изображений. Параметры функции - это оригинальный путь к изображению, новый путь к изображению (путь после сохранения изменения размера изображения). Теперь я хочу построить логику для требования ниже.

1. Если ширина оригинального файла больше 480 или меньше 450, тогда я хочу установить ширину выходного изображения равной 450px. Высота должна быть пропорциональна ширине.

  1. Если ширина исходного файла> его высота, то добавьте пробел сверху и снизу (к высоте), чтобы новая высота была 650.

Я использую следующий код для изменения размера изображения

try
    {
        Size oldSize=new Size();
        Bitmap oldbmp1 = (Bitmap) Bitmap.FromFile(originalpath);
        oldSize.Width=oldbmp1.Width;
        oldSize.Height=oldbmp1.Height;

        Size newSize=new Size()

        using (Bitmap newbmp = new Bitmap(newsize.Width, newsize.Height), oldbmp = Bitmap.FromFile(originalpath) as Bitmap)
        {
            Graphics newgraphics = Graphics.FromImage(newbmp);
            newgraphics.InterpolationMode =  System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
           // newsize = GetNewImageSize(oldSize); // here i want the new Size
            newgraphics.Clear(Color.FromArgb(-1));
            newgraphics.FillRectangle(Brushes.White, 0, 0, newsize.Width, newsize.Height);

            newgraphics.DrawImage(oldbmp, 0, 0, newsize.Width, newsize.Height);

                try
                {
                   // newgraphics.Save();

                    ImageCodecInfo[] Info = ImageCodecInfo.GetImageEncoders();
                    EncoderParameters Params = new EncoderParameters(1);
                    Params.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);
                    newbmp.Save(newpath, Info[1], Params);
                }
                catch (Exception ex1)
                {
                    throw ex1;
                }
                finally
                {
                    newbmp.Dispose();
                    oldbmp.Dispose();
                    oldbmp1.Dispose();
                }

        }
    }
    catch (Exception ee)
    {
        throw ee;
    }

Может ли какой-нибудь совет, что еще я должен добавить по этому поводу?

РЕДАКТИРОВАТЬ (так как поле комментария не позволит мне иметь больше символов)

Я пробовал это

float ratio = oldImg.Width / oldImg.Height;
SizeF newSize = new SizeF(desiredWidth, desiredWidth * ratio);

Но это не сработает, как я хочу Пример: мое оригинальное изображение имело ширину 450 и высоту 1094. Таким образом, отношение = 450/1094, что составляет 0,4113; Желаемая высота = желаемая ширина * соотношение т.е. 450 * 0,4113, что составляет 185,1

Насколько это пропорционально. Я думаю, что-то должно быть исправлено. Есть еще мысли?

Заранее спасибо

Ответы [ 2 ]

4 голосов
/ 16 июня 2009

Вам нужно простое соотношение между шириной и высотой изображения. Базовая арифметика.

float ratio = oldImg.Width / oldImg.Height;
SizeF newSize = new SizeF(desiredWidth, desiredWidth / ratio);

При этом новый размер будет пропорционален старому размеру.

Отредактировано для исправления типа и уточнения

Я думаю, что математики не хватает, так что вот так:

Допустим, у нас есть изображение 100 (ш) х 200 (ч) с соотношением (ш / ч) 0,5 , и мы хотим изменить его до ширины 400 . Мы просто делим желаемую ширину на соотношение, что дает нам 800 , правильный ответ.

Теперь, если бы мы захотели изменить размер того же изображения до ширины 50 , разделив его на отношение, мы получили бы высоту 100 .

Из-за опечатки в моей предыдущей версии ответа я использовал * вместо /, и это сделало мой ответ неправильным.

0 голосов
/ 17 июня 2009

В вашем примере вам нужно перевернуть дробь. Разделите на ваше соотношение вместо умножения. Это даст вам оригинал 1094.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...