Что такое лучший & ldquo; лучший & rdquo; способ создания эскиза с помощью ASP.NET? [закрыто]

История: пользователь загружает изображение, которое будет добавлено в фотогалерею. В рамках процесса загрузки нам нужно: а) сохранить изображение на жестком диске веб-сервера и б) сохранить миниатюру изображения на жестком диске веб-сервера.

«Лучший» здесь определяется как

  • Относительно прост в реализации, понимании и поддержании
  • В результате получается миниатюра приемлемого качества

Производительность и высококачественные миниатюры второстепенны.

23
задан 01.10.2019, 11:05

5 ответов

Я предполагаю, что Ваше лучшее решение использовало бы GetThumbnailImage от.NET Изображение класс.

// Example in C#, should be quite alike in ASP.NET
// Assuming filename as the uploaded file
using ( Image bigImage = new Bitmap( filename ) )
{
   // Algorithm simplified for purpose of example.
   int height = bigImage.Height / 10;
   int width = bigImage.Width / 10;

   // Now create a thumbnail
   using ( Image smallImage = image.GetThumbnailImage( width, 
                                                       height,
                                                       new Image.GetThumbnailImageAbort(Abort), IntPtr.Zero) )
   {
      smallImage.Save("thumbnail.jpg", ImageFormat.Jpeg);
   }
}
14
ответ дан 01.10.2019, 11:08
  • 1
    GetThumbnailImage только хорош для 60x60 или меньшие миниатюры - он использует миниатюру, сгенерированную камерой. Существуют также 29 других пограничных случаев, которые необходимо обработать , удостоверьтесь, что Вы знаете о них.... Между прочим, проект imageresizing.net является теперь бесплатным, с открытым исходным кодом, и поддерживаемый... И обрабатывает эти 29 ловушек правильно. – Lilith River 01.10.2019, 11:09
  • 2
    Нет тот единственные шоу, кто внес изменения в тот конкретный файл. Например, если Вы щелкаете правой кнопкой по решению, it' ll просто говорят Вам, кто внес изменения в тот конкретный .sln файл. Если Вы щелкаете правой кнопкой по проекту it' ll берут Вас, кто делал изменения в это particular.csproj файлом – foreyez 07.11.2019, 17:21

Избегайте GetThumbnailImage - он даст очень непредсказуемые результаты, так как он пытается использовать встроенный эскиз JPEG, если он доступен, даже если встроенный эскиз совершенно неправильного размера. DrawImage () - гораздо лучшее решение.

Оберните ваше растровое изображение в предложение using {} - вы не хотите, чтобы пропущенные дескрипторы плавали вокруг ...

Кроме того, вы захотите установить качество кодирования Jpeg на 90, и именно здесь GDI + выглядит лучше всего:

System.Drawing.Imaging.ImageCodecInfo[] info = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
System.Drawing.Imaging.EncoderParameters encoderParameters;
encoderParameters = new System.Drawing.Imaging.EncoderParameters(1);
encoderParameters.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 90L);

thumb.Save(ms, info[1], encoderParameters);
0
ответ дан 01.10.2019, 11:06
  • 1
    Вид работ, но печально doesn' t помогают, когда HTML инвертируется: <html><b>no</b>yes</html>. Я предполагаю, что мог выполнить итерации по содержанию, пытающемуся найти части, которые являются not' t теги. – Dragon 07.11.2019, 16:47

Можно использовать Изображение. GetThumbnailImage функционируют, чтобы сделать это для Вас.

http://msdn.microsoft.com/en-us/library/system.drawing.image.getthumbnailimage.aspx (.NET 3.5)

http://msdn.microsoft.com/en-us/library/system.drawing.image.getthumbnailimage (По сравнению с 80) .aspx (.NET 2.0)

public bool ThumbnailCallback()
{
  return false;
}

public void Example_GetThumb(PaintEventArgs e)
{
  Image.GetThumbnailImageAbort myCallback = new Image.GetThumbnailImageAbort(ThumbnailCallback);
  Bitmap myBitmap = new Bitmap("Climber.jpg");
  Image myThumbnail = myBitmap.GetThumbnailImage(40, 40, myCallback, IntPtr.Zero);
  e.Graphics.DrawImage(myThumbnail, 150, 75);
}
0
ответ дан 01.10.2019, 11:06
  • 1
    Во втором случае (где эти no, все еще в b теги на первом месте) я все еще хочу, чтобы вывод был yes. – Dragon 07.11.2019, 16:46

Вот метод расширения в VB.NET для класса изображений

Imports System.Runtime.CompilerServices

Namespace Extensions
   ''' <summary>
   ''' Extensions for the Image class.
   ''' </summary>
   ''' <remarks>Several usefull extensions for the image class.</remarks>
   Public Module ImageExtensions

      ''' <summary>
      ''' Extends the image class so that it is easier to get a thumbnail from an image
      ''' </summary>
      ''' <param name="Input">Th image that is inputted, not really a parameter</param>
      ''' <param name="MaximumSize">The maximumsize the thumbnail must be if keepaspectratio is set to true then the highest number of width or height is used and the other is calculated accordingly. </param>
      ''' <param name="KeepAspectRatio">If set false width and height will be the same else the highest number of width or height is used and the other is calculated accordingly.</param>
      ''' <returns>A thumbnail as image.</returns>
      ''' <remarks>
      ''' <example>Can be used as such. 
      ''' <code>
      ''' Dim _NewImage as Image 
      ''' Dim _Graphics As Graphics
      ''' _Image = New Bitmap(100, 100)
      ''' _Graphics = Graphics.FromImage(_Image)
      ''' _Graphics.FillRectangle(Brushes.Blue, New Rectangle(0, 0, 100, 100))
      ''' _Graphics.DrawLine(Pens.Black, 10, 0, 10, 100)
      ''' Assert.IsNotNull(_Image)
      ''' _NewImage = _Image.ToThumbnail(10)
      ''' </code>
      ''' </example>
      ''' </remarks>
      <Extension()> _
      Public Function ToThumbnail(ByVal Input As Image, ByVal MaximumSize As Integer, Optional ByVal KeepAspectRatio As Boolean = True) As Image
         Dim ReturnImage As Image
         Dim _Callback As Image.GetThumbnailImageAbort = Nothing
         Dim _OriginalHeight As Double
         Dim _OriginalWidth As Double
         Dim _NewHeight As Double
         Dim _NewWidth As Double
         Dim _NormalImage As Image
         Dim _Graphics As Graphics

         _NormalImage = New Bitmap(Input.Width, Input.Height)
         _Graphics = Graphics.FromImage(_NormalImage)
         _Graphics.DrawImage(Input, 0, 0, Input.Width, Input.Height)
         _OriginalHeight = _NormalImage.Height
         _OriginalWidth = _NormalImage.Width
         If KeepAspectRatio = True Then
            If _OriginalHeight > _OriginalWidth Then
               If _OriginalHeight > MaximumSize Then
                  _NewHeight = MaximumSize
                  _NewWidth = _OriginalWidth / _OriginalHeight * MaximumSize
               Else
                  _NewHeight = _OriginalHeight
                  _NewWidth = _OriginalWidth
               End If
            Else
               If _OriginalWidth > MaximumSize Then
                  _NewWidth = MaximumSize
                  _NewHeight = _OriginalHeight / _OriginalWidth * MaximumSize
               Else
                  _NewHeight = _OriginalHeight
                  _NewWidth = _OriginalWidth
               End If
            End If
         Else
            _NewHeight = MaximumSize
            _NewWidth = MaximumSize
         End If
         ReturnImage = _
            _NormalImage.GetThumbnailImage(Convert.ToInt32(_NewWidth), Convert.ToInt32(_NewHeight), _Callback, _
                                    IntPtr.Zero)
         _NormalImage.Dispose()
         _NormalImage = Nothing
         _Graphics.Dispose()
         _Graphics = Nothing
         _Callback = Nothing
         Return ReturnImage
      End Function
   End Module
End Namespace

Извините, кодовый тег не любит код vb.net.

3
ответ дан 01.10.2019, 11:07
  • 1
    " Извините тег кода doesn' t как код " vb.net; = > я don' t обвиняют его: P – Alex Nolasco 01.10.2019, 11:07

GetThumbnailImage будет работать, но если вы хотите немного лучшего качества, вы можете указать параметры изображения для класса BitMap и сохранить загруженное изображение в нем. Вот пример кода:

Image photo; // your uploaded image

Bitmap bmp = new Bitmap(resizeToWidth, resizeToHeight);
graphic = Graphics.FromImage(bmp);
graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphic.SmoothingMode = SmoothingMode.HighQuality;
graphic.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphic.CompositingQuality = CompositingQuality.HighQuality;
graphic.DrawImage(photo, 0, 0, resizeToWidth, resizeToHeight);
imageToSave = bmp;

Это обеспечивает лучшее качество, чем GetImageThumbnail из коробки

36
ответ дан 01.10.2019, 11:08
  • 1
    @foreyez да, но если Вы щелкаете правой кнопкой по всей папке управления исходным кодом (который Вы ранее отобразили в своей Рабочей области), Вы будете видеть все изменения, внесенные во все файлы в той папке, которая является тем, что Вы попросили. – vlad 07.11.2019, 17:21

Теги

Похожие вопросы