Как создать Thumbnail на ASP.NET

Thumbnail – это маленькая картинка, указывающая на большую картинку… Короче, картинка, созданная для предварительного просмотра большой кратинки.
В Windows это называется «эскиз» картинки, вобщем, на примере слева все видно, что это такое

В ASP.NET есть отличные инструменты для работы с графикой, пример того, как сделать надпись на картинку я приводил недавно. Вот теперь про уменьшение размеров изображения с помощью .NET.

Итак, задача: создать ASPX страницу, в которую передается URL картинки (которая лежит на сервере) и размер картинки, которую желаем получить (только ширину), а в ответ, она выдает JPG нужного размера

  protected void Page_Load(object sender, EventArgs e)
   {
     string strPathToImg = Request.QueryString["img"]; //thumbnalil.aspx?img=/url/to/big/image.jpg
    int intThumbWidth = Convert.ToInt32(Request.QueryString["w"]); //&w=ширина требуемого тамбнейла (мелкой картинки)
    if (strPathToImg != null)
     {
      string filePath = Server.MapPath(strPathToImg);
      if (intThumbWidth != 0)
        {
         GetThumbnail(filePath, intThumbWidth);
        }
      else
       {
         GetThumbnail(filePath, 180); //если параметр w не задан, то рендерит картинку шириной 180 пикселей
       }
    }
  }

Далее загружаем данные кодека

  private static ImageCodecInfo getCodecInfo(string mt)
    { //вот этот кусок кода нужен чтобы .NET использовала нормальный JPEG кодек или что-то подобное, я уже и не помню :-)...
     ImageCodecInfo[] ici = ImageCodecInfo.GetImageEncoders();
     int idx = 0;
     for (int ii = 0; ii < ici.Length; ii++)
      {
       if (ici[ii].MimeType == mt)
        {
          idx = ii;
          break;
        }
     }
        return ici[idx];
    }

и, собственно, самая важная функция:

   protected void GetThumbnail(string fname, int Width)
  {
  int intW = 0; //настоящая картинка
  int intH = 0;

  int intW1 = Width; //тумбнейл
  int intH1 = 0;

  Response.ContentType = "image/jpeg"; //тут задаем http заголовок, чтобы браузер посетителя рендерил картинку, а не в html байты выдавал ))
  Response.Clear();
  System.Drawing.Image g = System.Drawing.Image.FromFile(fname);

  intW = g.Width; //берем размеры исходной картинки
  intH = g.Height;

  intH1 = Convert.ToInt32(intH * intW1 / intW); //тут считаем какова должна получиться высота картинки при заданной ширине

  Bitmap b = new Bitmap(intW1, intH1);

  Graphics gTemp = Graphics.FromImage(b);
  gTemp.InterpolationMode = InterpolationMode.Bicubic;
  gTemp.PixelOffsetMode = PixelOffsetMode.HighQuality;
  gTemp.DrawImage(g, 0, 0, intW1, intH1);

  EncoderParameters ep = new EncoderParameters(1);
  ImageCodecInfo icJPG = getCodecInfo("image/jpeg");

  ep.Param[0] = new EncoderParameter(Encoder.Quality, (long)80); //задаем качество jpeg

  //выбираем куда и как сохранять, в файл:

  //b.Save(Path.GetFileNameWithoutExtension(fname) + "_t.jpg", icJPG, ep);
  //b.Save("D:\\aaa.jpg", icJPG, ep);

  //или сразу в браузер отправлять
  b.Save(Response.OutputStream, icJPG, ep);

  gTemp.Dispose();
  b.Dispose();
  g.Dispose();
  //return Path.GetFileNameWithoutExtension(fname) + "_t.jpg";

  }

Пример работы: можете посмотреть на главную страницу сайта http://www.kazved.ru, там все маленькие картинки генерятся из больших. Это немного напрягает сервер, зато экономит кучу времени контент-менеджеру, который ежедневно обновляет веб-сайт.

Или вот примеры прямо здесь, с того же сайта kazved.ru:
Исходное изображение:

URL: http://kazved.ru/uploadimg/138544_203912_на-7-универсиада---муратовв.jpg

Преобразованное изображение:

URL: http://kazved.ru/Thumbnail.aspx?img=/uploadimg/138544_203912_на-7-универсиада---муратовв.jpg&w=100

Скачать исходники.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>