Целесообразно ли использовать .ashx при отображении изображений?

Целесообразно ли использовать обработчик для отображения изображений? проблема в том, что я не могу щелкнуть правой кнопкой мыши и сохранить эти изображения. Он показывает имя обработчика и универсальный обработчик Asp.net в качестве типа сохранения, поэтому я не могу сохранить изображение, но изображение с графическим интерфейсом потрясающее по качеству. Я показываю одно изображение разных размеров. используя 2 обработчика, и код работает нормально, но если я не использую обработчик, мне нужно изменить их размер по отдельности, а затем сохранить в разных папках.


person Fhd.ashraf    schedule 11.11.2011    source источник
comment
Я написал imageresizing.net, чтобы решить все проблемы и подтемы, которые Видор поднимает в ответе ниже. Вы должны взглянуть - это стало стандартом де-факто. Если вы делаете свои собственные, вы действительно должны прочитать этот список ловушек, которых следует избегать< /а>   -  person Lilith River    schedule 01.12.2011


Ответы (2)


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

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

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

  • Миниатюра
  • Обрезанное изображение
  • Эффекты «отражения» (как будто оно было над блестящей поверхностью)
  • Различные галереи

Тогда это был просто случай вызова его из пользовательского элемента управления Image и передачи правильных параметров.

РЕДАКТИРОВАТЬ: Что касается сохранения изображений, я могу сделать это нормально, пока я заставляю расширение .ashx, которое браузер пытается дать, в формате JPEG (или что-то еще).

Я не могу привести вам полный рабочий пример .ashx, и есть так много подтем, которые вам нужно будет рассмотреть:

  • Безопасность - чтение только из определенных мест
  • Форматы - вы собираетесь выводить все изображения, скажем, в JPEG, независимо от исходного формата?
  • HttpHandlers — как их создавать и использовать (не только для изображений)
  • Работа с графикой — ознакомьтесь с объектом Graphics в .NET.
  • Потоки памяти

В качестве небольшого примера (в VB.NET) вот простой метод изменения размера изображения с учетом новой ширины и высоты:

Imports System
Imports System.Web
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.IO
Imports CustomImaging
Imports System.Collections.Generic

Public Class ImgHandler : Implements IHttpHandler


  Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest

    'Process the image and output it as a stream from memory

  End Sub

  Public Shared Function ResizeImage(ByVal image As System.Drawing.Image, ByVal width As Integer, ByVal height As Integer) As System.Drawing.Bitmap
        'a holder for the result
        Dim result As New Bitmap(width, height)
        'use a graphics object to draw the resized image into the bitmap
        Dim g As Graphics = Graphics.FromImage(result)
        Try
            'set the resize quality modes to high quality
            g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality
            'draw the image into the target bitmap
            g.DrawImage(image, 0, 0, result.Width, result.Height)
        Catch ex As Exception

        Finally 'clean up resources
            If Not g Is Nothing Then g.Dispose()

        End Try
        'return the resulting image
        Return result
   End Function

   Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
        Get
            Return False
        End Get
    End Property

End Class
person Widor    schedule 11.11.2011
comment
Это именно то, о чем я говорю, сэр! Я просто хочу загрузить одно изображение, а затем изменить его размер до разных размеров, но когда я хочу щелкнуть правой кнопкой мыши и сохранить его. + не могли бы вы помочь мне с образцом, если он у вас есть, если вы только не возражаете .. я совсем новичок в этом. спасибо мельница! - person Fhd.ashraf; 11.11.2011
comment
Мы создали оконный сервис с наблюдателем за файлами, чтобы создавать копии изображений с измененным размером по мере их загрузки пользователем. Вы получаете изображения разных размеров, но без загрузки обработчика. Подходы, конечно, зависят от того, насколько хорошо вы контролируете свою живую среду. - person Crab Bucket; 11.11.2011
comment
Братан, мне нужна помощь.. Скажи мне, что мне делать на этом перекрестке? используйте обработчик и измените размер 1 изображения, используя их, или используйте изменение размера изображений, что, я думаю, потребует много работы в конце дня, но я готов к этому, если это будет полезно в конце дня. .! - person Fhd.ashraf; 11.11.2011
comment
честно - услуга не так уж и сложна. Это заняло у нас, может быть, полдня. Большое предостережение: можете ли вы установить это на своем действующем сервере. У вас есть такой контроль. Для меня - я бы и написал сервис. Это более эффективно, чем делать это на лету, и не сложнее, ИМХО. Это помогает? - person Crab Bucket; 11.11.2011

Я бы не рекомендовал использовать общие обработчики для отображения изображений.

Раньше я использовал этот подход, но если изображение не меняется довольно часто, я думаю, что это пустая трата ресурсов.

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

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

Еще одним преимуществом этого является то, что изображения не так сильно ошибаются, как код!

person Curt    schedule 11.11.2011
comment
Похоже, вам следует взглянуть на imageresizing.net Кэширование на диске устраняет накладные расходы, хотя само изменение размера изображения в любом случае очень оптимизировано. - person Lilith River; 01.12.2011