Комментарии: Python, Django: Автоматический ресайз загружаемых изображений http://www.codeisart.ru/python-django-automatically-resize-uploaded-images/ Статьи по SEO, дизайну и программированию. Переводы на веб-тематику. Исследования и наработки в области интернет-технологий. Tue, 08 Jul 2014 14:54:49 +0000 hourly 1 http://wordpress.org/?v=3.5.1 Автор: Владимир http://www.codeisart.ru/python-django-automatically-resize-uploaded-images/comment-page-1/#comment-132965 Владимир Sat, 02 Jun 2012 04:11:27 +0000 http://www.codeisart.ru/?p=1476#comment-132965 Моя реализация состоит в том чтобы хранить оригиналы в GridFS (MongoDB). Во первых мы решаем проблему с масштабируемостью ресурса и хранением ненужных изображений. При первом обращении к оригиналу или Thumbnail’у мы достаем из базы изображение, ресайзится при нужде и сохраняется в кэше. Для ресайза используется pillow. Если пользователь удаляет пост, то удаляется и оригинал, и чистится кэш.

]]>
Автор: Gordio http://www.codeisart.ru/python-django-automatically-resize-uploaded-images/comment-page-1/#comment-116865 Gordio Fri, 04 Nov 2011 00:22:25 +0000 http://www.codeisart.ru/?p=1476#comment-116865 Предпочитаю и вам рекомендую попробовать https://github.com/SmileyChris/easy-thumbnails , в нем и загружаемый файл можно подготовить и тумбочки в кеш складывать.

]]>
Автор: trilby http://www.codeisart.ru/python-django-automatically-resize-uploaded-images/comment-page-1/#comment-17483 trilby Wed, 10 Feb 2010 07:40:58 +0000 http://www.codeisart.ru/?p=1476#comment-17483 Skaizer: ну как, не нашли способ ресайзить оригинальную загруженную картинку до приемлемых размеров? то, что я ищу :)

]]>
Автор: Skaizer http://www.codeisart.ru/python-django-automatically-resize-uploaded-images/comment-page-1/#comment-11973 Skaizer Sat, 05 Sep 2009 10:52:29 +0000 http://www.codeisart.ru/?p=1476#comment-11973 Спасибо за метод, интересно! Я все-таки стал использовать code.google.com/p/sorl-thumbnail/ для своих проектов, возможности библиотеки очень богатые. К сожалению, где-то приходится подпиливать своими патчами, но в целом она умеет все, что мне нужно при работе с изображениями и превьюшками.

]]>
Автор: Никита http://www.codeisart.ru/python-django-automatically-resize-uploaded-images/comment-page-1/#comment-11860 Никита Thu, 03 Sep 2009 15:05:52 +0000 http://www.codeisart.ru/?p=1476#comment-11860 Я использую немного другой подход, хотя, что-то подобное тоже писал давно:

Собственно, в модели есть картинка, одна основная (абстрактная, get_thumbnail_url) функция создания тумбочек и несколько используемых (get_small, get_big, …) на сайте.

get_thumbnail_url проверяет есть ли изображение, потом проверяет есть ли тумбочка, если нет, то строит путь os.makedirs и создает уменьшенную копию, возвращает путь.

Кстати, для уменьшения использую стандартную функция image.thumbnail((width,height), ANTIALIAS), где один из параметров может быть *.


class Photo(models.Model):
   adv = models.ForeignKey(Adv, verbose_name=u"объявление")
   photo = models.ImageField(verbose_name=u"фото",  upload_to=u"photos/%Y/%m/%d")
   
   def get_thumbnail_url(self, width, height):
      """Возвращает URL уменьшенной копии фотографии"""
      if not os.path.exists(self.photo.path):  return None
      thumb_url = None
      photo = str(self.photo)
      full_path_to_file = "%s/%s" % (MEDIA_ROOT, photo)
      filename = self.photo.path[self.photo.path.rfind("/")+1:]
      upload_to = self.photo.path.replace(MEDIA_ROOT+"/", "").replace("/"+filename,"")
      path_to_thumbnail_dir = "%s/thumbnails/%s/%sx%s" % (MEDIA_ROOT, upload_to, str(width), str(height))
      if not os.path.exists(path_to_thumbnail_dir): os.makedirs(path_to_thumbnail_dir)
      path_to_thumbnail = "%s/%s" % (path_to_thumbnail_dir, filename)
      if not os.path.exists(path_to_thumbnail):
         try:
            image = open_image(self.photo.path)
            image.thumbnail((width,height), ANTIALIAS)
            image.save(path_to_thumbnail, image.format, quality=95)
         except:
            return None
      return "%sthumbnails/%s/%sx%s/%s" % (MEDIA_URL, upload_to, str(width), str(height), filename)

   def get_small(self):
      if not self.get_thumbnail_url(100, 75):
         return "%simages/no-photo.jpg" % MEDIA_URL
      return self.get_thumbnail_url(100, 75)
   
   def get_medium(self):
      return self.get_thumbnail_url(180, "*")
   
   def get_big(self):
      return self.get_thumbnail_url(400, "*")
]]>
Автор: Skaizer http://www.codeisart.ru/python-django-automatically-resize-uploaded-images/comment-page-1/#comment-7452 Skaizer Thu, 07 May 2009 10:53:13 +0000 http://www.codeisart.ru/?p=1476#comment-7452 Попробовал для ресайзов использовать sorl-thumbnail (code.google.com/p/sorl-thumbnail/), действительно мощный модуль, но возникли вопросы:

  1. Можно ли использовать ресайз изображений sorl-thumbnail на уровне загрузки файла изображения. Т.е. я понимаю, что sorl-thumbnail создаст ресайз при первой попытке открыть миниатюру, но мне бы так же хотелось ресайзить оригинальное изображение, например до некоторого максимального значения, определенного в настройках системы. Чтобы не хранить 5,6,7 и т.д. мегапиксельные фото, я хочу хранить оригинал, например в разрешении не превышающем 1600х1200, а из него потом делать различные сумбнейлы. На данный момент я произвожу этот ресайз своими средствами, возможно это можно организовать через sorl-thumbnail ?
  2. В проекте несколько приложений, в которых должен использоваться sorl-thumbnail, например персональный профиль пользователя, где юзер может закачать аватар и фотогалерея, где так же необходимо создавать несколько превьюшек загружаемых изображений. Но настройки в sorl-thumbnail в settings.py ведь будут распространяться для всех приложений, использующих sorl-thumbnail. Файловая организация проекта такова, чтоизображения различных приложения хранятся в различных директориях. Thumbnail’ы должны сохраняться в поддиреториях директории приложения. Если мы зададим префикс THUMBNAIL_PREFIX или директории THUMBNAIL_BASEDIR, THUMBNAIL_SUBDIR то они будут одинаковы для всего проекта. Можно ли сделать их локальными для каждого из приложений, где необходим sorl-thumbnail?

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

]]>
Автор: rootart http://www.codeisart.ru/python-django-automatically-resize-uploaded-images/comment-page-1/#comment-7176 rootart Wed, 29 Apr 2009 21:15:17 +0000 http://www.codeisart.ru/?p=1476#comment-7176 Ну по перше я не думаю що зміна розмірів картинки методами PIL вимагає дуже багато ресурсів (звісно все залежить від потужностей). Крім того якщо вже на те пішло то потрібно ставити певного роду чергу обробки у випадку великої завантаженості. Особисто я для себе використовував схожі методи описані тут http://www.djangosnippets.org/snippets/20/ .

Відносно ресайза на ходу то можна застосувати тільки потрібно правильно кешувати результат
http://www.djangosnippets.org/snippets/192/

]]>
Автор: woodpeaker http://www.codeisart.ru/python-django-automatically-resize-uploaded-images/comment-page-1/#comment-7168 woodpeaker Wed, 29 Apr 2009 15:15:13 +0000 http://www.codeisart.ru/?p=1476#comment-7168 поправка: не в вашем случае 5-6 сек на проц… это в моем случае было:-) В Вашем будет около 1-2 сек, взамисимости от общей загрузки

]]>
Автор: woodpeaker http://www.codeisart.ru/python-django-automatically-resize-uploaded-images/comment-page-1/#comment-7167 woodpeaker Wed, 29 Apr 2009 15:13:32 +0000 http://www.codeisart.ru/?p=1476#comment-7167 А почему вы не учитываете нагрузки на сервер при ресайзинге?

У меня была задача — налету собирать из кусочков PNG board, накладывать слои и менять размер картинки по запросу, но данная задача так грузила сервер, что я от такого отказался…

Точнее не то чтобы отказался, а дополнил: при первом запросе картинки размер ресайзится и ложится в «кэш-папку», далее отдается как статика.

По вашему получается, что на одну картинку надо около 5-6 сек проца(40-50%) + памяти (на глаз не помню сколько). + Если запросов будет больше чем 1 в две сек ваш сервак будет испытывать некие трудности, вплоть до зависания.

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

А с ресайзом налету — не вариант, будет сильно тупить.

]]>
Автор: Skaizer http://www.codeisart.ru/python-django-automatically-resize-uploaded-images/comment-page-1/#comment-7157 Skaizer Wed, 29 Apr 2009 10:36:36 +0000 http://www.codeisart.ru/?p=1476#comment-7157 excieve, да, действительно, не подумал о ситуациях, когда в будущем размеры необходимо будет изменить. На момент написания этого скрипта реализация с помощью шаблонного тега или фильтра казалась несколько странной. Спасибо за обоснование! Минус конечно в том, что придется хранить тонны изображений, которые возможно окажутся не нужными. А пользователи любя загрузить картинки, снятые на >5 мегапиксельные камеры…

maxcentry, благодарю, и правда изображения стали смотреться по четче. в Python это реализуется достаточно просто:

from PIL import ImageEnhance
sharpen = ImageEnhance.Sharpness(image)
image = sharpen.enhance(15.0)
]]>
Автор: maxcentry http://www.codeisart.ru/python-django-automatically-resize-uploaded-images/comment-page-1/#comment-7151 maxcentry Wed, 29 Apr 2009 07:26:51 +0000 http://www.codeisart.ru/?p=1476#comment-7151 Не знаю на сколько это просто в реализации на Python, но избыточное (больше чем это нужно для реального изображения) использование фильтров по типу Sharpen и затем уменьшение изображения позволит добиться большей резкости в уменьшенном варианте изображения. Степень избыточности можно подобрать опытным путем.

]]>
Автор: excieve http://www.codeisart.ru/python-django-automatically-resize-uploaded-images/comment-page-1/#comment-7139 excieve Wed, 29 Apr 2009 01:09:40 +0000 http://www.codeisart.ru/?p=1476#comment-7139 ИМХО, не очень правильный подход. А если в будующем будет нужно изменить этот размер? Мне кажется, что лучше сохранять в оригинальном размере, а при доступе к изображению в шаблоне — применять фильтр или тэг, естественно, кешируя результат. Что дает большую гибкость как в настройке, так и в использовании — можно легко изпользовать сколько угодно вариантов размеров изображения. Такой подход уже реализован в sorl-thumbnail кажется. Однако, если изменения размеров не планируется в принципе или нужно только изначально ограничить размер неким максимальным значением, то это, конечно, подходящее решение.

]]>