Как оптимизировать размер изображения в приложении ASP.NET (с C #)? - PullRequest
1 голос
/ 20 марта 2012

У меня есть этот код, написанный на C #:

            int maxSideSize = 125;
            MemoryStream memory = new MemoryStream( File.ReadAllBytes( Path.GetFullPath( "test1.png" ) ) );
            Image img = Image.FromStream( memory );

            //Determine image format 
            ImageFormat fmtImageFormat = img.RawFormat;

            //get image original width and height 
            int intOldWidth = img.Width;
            int intOldHeight = img.Height;

            //determine if landscape or portrait 
            int intMaxSide;
            if ( intOldWidth >= intOldHeight ) {
               intMaxSide = intOldWidth;
            } else {
               intMaxSide = intOldHeight;
            }

            if ( intMaxSide > maxSideSize ) {

               //set new width and height 
               double percent = maxSideSize / (double)intMaxSide;
               intNewWidth = Convert.ToInt32( percent * intOldWidth );
               intNewHeight = Convert.ToInt32( percent * intOldHeight );
            } else {
               intNewWidth = intOldWidth;
               intNewHeight = intOldHeight;
            }

            //create new bitmap 
            Bitmap bmpResized = new Bitmap( img, intNewWidth, intNewHeight );

            //save bitmap to disk 
            string path = Path.Combine( "C:\\Temp", test1.png" ) );

            bmpResized.Save( memory, fmtImageFormat );
            img.Save( path );

            //release used resources 
            img.Dispose();
            bmpResized.Dispose();
         } catch (Exception e) {
            Console.Write( e.Message );
         }

Может ли вышеприведенный код быть оптимизирован для приложения ASP.NET?

Я думаю, что если 1000 пользователей подключены к моемусайта, и, возможно, 20% из них загружают изображение размером более 125 пикселей (как по ширине, так и по высоте), тогда приложение может аварийно завершить работу.

Мой друг рекомендовал использовать библиотеку Canvas или Drawing2D.Что произойдет, если файл уже существует?Можно перезаписать?

Извините за глупый вопрос.Мне нужны советы в этом случае.

Ответы [ 3 ]

1 голос
/ 20 марта 2012

Маловероятно, что 20% пользователей будут загружать изображение в ту же секунду.Конечно, вы должны убедиться, что вы изменяете размер изображения, когда оно загружено, а НЕ когда оно обслуживается.Более того, если ваш сервер не сможет выполнить работу, он не будет зависать, но поставит пользователей в очередь, что приведет к снижению времени отклика.

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

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

Вы можете загрузить файл с перегрузкой этого конструктора и сохранить его с этой Перегрузкой метода сохранения

0 голосов
/ 17 августа 2012

Вкл. Нажатие кнопки при загрузке файла:

System.Drawing.Bitmap bmpPostedImage = new System.Drawing.Bitmap(File1.PostedFile.InputStream);
     System.Drawing.Image objImage = ScaleImage(bmpPostedImage, 81);
     objImage.Save(SaveLocation,ImageFormat.Png);
     lblmsg.Text = "The file has been uploaded.";

public static System.Drawing.Image ScaleImage(System.Drawing.Image image, int maxHeight)
        {
            var ratio = (double)maxHeight / image.Height;

            var newWidth = (int)(image.Width * ratio);
            var newHeight = (int)(image.Height * ratio);

            var newImage = new Bitmap(newWidth, newHeight);
            using (var g = Graphics.FromImage(newImage))
            {
                g.DrawImage(image, 0, 0, newWidth, newHeight);
            }
            return newImage;
        }

Подробнее Нажмите здесь

http://satindersinght.blogspot.in/2012/08/how-to-resize-image-while-uploading-in.html

0 голосов
/ 20 марта 2012

Вы можете использовать этот пакет nuget http://nuget.org/packages/Simple.ImageResizer

Как использовать: https://github.com/terjetyl/ImageResizer

Я использовал классы wpf, которые должны быть более дружественными в памяти, чем старая система.Занятия по рисованию.

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