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

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

creating thumbnail on asp.net Thumbnail - это маленькая картинка, указывающая на большую картинку... Короче, картинка, созданная для предварительного просмотра большой кратинки. Laughing
В Windows это называется "эскиз" картинки, вобщем, на примере слева все видно, что это такое Smile

В 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: 

Исходное изображение:
пример thumbnail asp.net

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

Преобразованое изображение:
пример thumbnail asp.net

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

КАЧАТЬ ИСХОДНИКИ ТУТ:

Выкладываю Open Source, под лицензией Apache 2.0 http://www.apache.org/licenses/LICENSE-2.0
Пользуйтесь на здоровье: thumbnail.rar (2,03 kb)

Просьба: если будете публиковать где-то, ставьте ссылку на http://www.drfaust.ru

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen

Об авторе блога

Адель Шигабутдинов (веб-разработчик)