Pull to refresh

Comments 33

Картинка подобрана правильно настолько, что словосочетание Resize To Fill обретает новый смысл.
А о самом приложении сказать особо нечего. Мне лично пока вполне хватает filebrower versions; Кроме того вспоминается заслуживший когда-то статус легендарного sorl.thumbnail
Он еще и очень, очень медлительный.
Если использовать кеширование, он ни разу медлительным не будет :-)

(старый комментарий стёр, т.к. ошибся веткой, извините)
Прям да. Посмотрите его api и статью, на которую я дал ссылку.
По ссылке много букв сплошные хочуны на тему «было бы здорово», которые в принципе не решить без человеческого вмешательства. Ну, разве что реализовывать детекторы лиц.

А с простыми задачами — кропнуть, вписать целиком, вписать по ширине, вписать по высоте, отбить поля — с этим любые решения справляются, солр в том числе.
> По ссылке много букв
Хороший аргумент, возьму на вооружение.

> По сплошные хочуны на тему «было бы здорово»
Вообще-то это наиболее общий набор того, с чем приходится сталкиваться при разработке сайтов. Иногда бывают более специфические требования. И все они (и общие и специфические) реализуются с помощью imagekit.

> с этим любые решения справляются, солр в том числе
Приведите мне пожалуйста пример, как заполнить изображением квадрат 100×100. Заполнить значит, что после ресайза одна из сторон должна быть 100 пикселей, а вторая 100 или больше, в соответствии с пропорциями исходного изображения.
Не очень представляю, как это — квадрат, у которого одна сторона ровно 100 пикселей, а другая — 100 или больше.
Я нигде не писал, что у квадрата вторая сторона 100 или больше. Квадрат 100×100. Изображение должно его накрывать. У изображения (не квадрата) одна из сторон 100 или больше.
> А с простыми задачами
Вообще, мне интересно. Вот вы судя по всему используете sorl.thumbnail. И что вы делаете, когда у вас не «простой случай»? Идете и к дизайнеру и говорите «ты знаешь, я тут использую sorl.thumbnail, так что извини приятель, сделать как ты хотел не получится»?
Пример приведите, что ли. Мне, каюсь, вообще сложно представить, что тумбам нужно кроме ресайза и кропа (и неважно, с сохранением пропорций или без).
Выше же привел, вы его представить не можете.
Не могу уяснить постановку задачи, виноват. Что-то типа такого?

{% thumbnail "x100" crop="100,100" as im%}
    <img src="{{ im.url }}">
{% endthumbnail %}
> Что-то типа такого?
Я же заранее сказал, что это не решается sorl.thumbnail.

Такой код сделает из картинки из топика вот такую:

Размер 53×100, квадрат не заполнен.
Почему же не решается?

sorl-thumbnail.readthedocs.org/en/latest/template.html#is-portrait

Более того, ничто не мешает написать свой тэг:

sorl-thumbnail.readthedocs.org/en/latest/examples.html?highlight=get_thumbnail#low-level-api-examples

А заводить дополнительные поля для каждого вида превью – это, извините, рак.
> Почему же не решается?
Т.е. каждый раз, когда эта картинка нужна, придется написать минимум:

{% if item.image|is_portrait %}
    {% thumbnail item.image "100x" %}
        <img src="{{ im.url }}">
    {% endthumbnail %}
{% else %}
    {% thumbnail item.image "x100" %}
        <img src="{{ im.url }}">
    {% endthumbnail %}
{% endif %}

Уже каша. А у картинки еще другие атрибуты могут быть, а она еще в ссылку может оборачиваться.

Но формально, задача все же решена благодаря существованию для этого частного случая фильтра is_portrait. Давайте немного усложним: точно так же накрыть прямоугольник 120×100 пикселей.

> Более того, ничто не мешает написать свой тэг:
Где там про написание своего тега?
Вы дальше собственного носа не видите, или нарочно игнорируете документацию:

{% thumbnail item.image "100x" %}
    <p>Оберните картинку хоть в «Войну и мир» Толстого</p>
    <a href="http://lmgtfy.com/?q=http%3A%2F%2Fsorl-thumbnail.readthedocs.org%2Fen%2Flatest%2F">
        <img src="{{ im.url }}" width="{{ im.x }}" height="{{ im.y }}">
    </a>
{% endthumbnail %}
Я не понимаю, пример чего вы привели. Это никак не относится не к изображению 120×100 не к 100×100. Вот о чем я говорю: у нас получается 2 ветки и код сильно усложняется:

{% if item.current %}
	{% if item.image|is_portrait %}
		{% thumbnail item.image "100x" as im %}
			<img src="{{ im.url }}" width="{{ im.x }}" height="{{ im.y }}">
		{% endthumbnail %}
	{% else %}
		{% thumbnail item.image "x100" as im %}
			<img src="{{ im.url }}" width="{{ im.x }}" height="{{ im.y }}">
		{% endthumbnail %}
	{% endif %}
	{{ item.name }}
{% else %}
	<a href="{{ item.url }}">
		{% if item.image|is_portrait %}
			{% thumbnail item.image "100x" as im %}
				<img src="{{ im.url }}" width="{{ im.x }}" height="{{ im.y }}">
			{% endthumbnail %}
		{% else %}
			{% thumbnail item.image "x100" as im %}
				<img src="{{ im.url }}" width="{{ im.x }}" height="{{ im.y }}">
			{% endthumbnail %}
		{% endif %}
		{{ item.name }}
	</a>
{% endif %}


Сравните с:

{% if item.current %}
	<img src="{{ item.image_small.url }}" width="{{ item.image_small.x }}" height="{{ item.image_small.y }}">
	{{ item.name }}
{% else %}
	<a href="{{ item.url }}">
		<img src="{{ item.image_small.url }}" width="{{ item.image_small.x }}" height="{{ item.image_small.y }}">
		{{ item.name }}
	</a>
{% endif %}
Опять вы не читаете. Пример выше относится к:
Уже каша. А у картинки еще другие атрибуты могут быть, а она еще в ссылку может оборачиваться.


И на каждую превьюшку вы будете добавлять поле в модель? А если у вас их 20 будет? Заказчик может закапризничать и захочет размеры поменять?

А для того, чтобы не усложнять код шаблона как раз и нужен get_thumbnail. Напишите свой тэг/метод/функцию, который/ая будет считать вам необходимые пропорции.
> Опять вы не читаете.
Да нет же, это вы. Мы обсуждаем конкретный пример, покрыть превьюшкой площадь 100×100. Там, где вы войну и мир написали, этого нет.

> А если у вас их 20 будет
Примерно столько и есть. Каждая в модели.

> Заказчик может закапризничать и захочет размеры поменять?
Это не каприз, а стандартная практика. Меняются размеры, добавляются фильтры, вотермарки. Потом очищается кеш.

> Напишите свой тэг/метод/функцию, который/ая будет считать
> вам необходимые пропорции.
Примеров, как правильно это делать что-то в документации не видно. А если с самого начла разбираться, как что работает, зачем тогда вообще использовать sorl-thumbnail?

У imagekit любая манипуляция делается проще простого. Создается фильтр — функция, принимающая картинку и отдающая другую картинку. Этот фильтр указывается в моделе. Все.
sorl.thumbnail — как вариант, когда нет доступа к конфигурации nginx или он стоит как сервер, HttpImageFilterModule nginx'a когда есть такая возможность) Последний позволит настроить кеширование, ресайз разный, даже поворот.
Есть даже приложение специальное для Django использующее этот модуль nginx: django-nginx-image
Весь Image Processing демонстрируется на Lena.bmp, а тут давняя знакомая IRL.
Как-то не очень я понимаю подход с дополнительным полем для каждого тумбнейла в модели.
В базе эти поля не создаются, по этому лишнего мусора не приносят.
Опять заклюют, но Django это был мой мой любимый фильм в детстве, а от мелодии и сейчас «волосы шевелятся».
Ну, а блондинок я не очень… даже с такими достоинствами…
Я пользую иногда старый django-imagekit из ветки support/0.4.x после уже пошел такой бред как вверху описано в посте что под каждый размер надо добавлять поле в модель.
В старых версиях было удобно что создаешь spec файл с нужными размерами и процессорами и указываешь его в модели.
Вообще чаще всего достаточно простенького djangothumbnails.com
Sign up to leave a comment.

Articles