Если посмотреть исходный код функции CFile::ResizeImageGet(), то станет ясно, что с ручным центрированием изображений она просто так не справится. Утрированный пример ситуации, когда это может понадобится: есть горизонтальный блок-превью картинки, а сама картинка вертикальная, и «точка интереса» этой картинки, вовсе не в центре. Проще говоря, у нас такая картинка (1), а на сайте получаем вот это (2):
Очевидно, что по-хорошему лицо должно быть в центре кадра или около того, но явно не так. Понимая проблему, мой знакомый попросил исправить это недоразумение на своём сайте, благо - тот на битриксе Конечно, можно было было по-быстрому хардкодом прописать координаты для каждой фотографии в css и оставить как есть, но я сделал модуль, вот как это выглядит:
По сути, всё что делает модуль - это запоминает связку: id картинки -> позиция x, y. Что бы в вёрстке картинка принимала нужную позицию нужно исходя из размеров превью (пропорционально(!) уменьшенный оригинал) и размеров блока-превью нужно привести HTML к следующему виду:
И добавить примерно такой js-код:
$(document).ready(function () {
// Центрирование изображений по оси Y
imgPositionerByY();
$(window).resize(function() {
imgPositionerByY();
});
});
// Центрирование изображений по оси Y
function imgPositionerByY() {
$('.item-with-photo').each(function() {
var thumb_h = $(this).data('thumb-h');
var thumb_w = $(this).data('thumb-w');
var point_x = $(this).data('point-x');
var point_y = $(this).data('point-y');
var thumbHeightToTarget = thumb_h * point_y / 100;
var aspectThumbToBox = thumb_w / $(this).width();
var thumbHeightInBox = thumbHeightToTarget / aspectThumbToBox;
var halfHeightOfBox = $(this).height() / 2;
var topOffset = -Math.round(Math.abs(thumbHeightInBox - halfHeightOfBox));
$(this).css('background-position', '-50% '+topOffset+'px');
});
}
Здесь js рассчитывает высоту блока, высоту картинки превью, которая подстраивается под ширину блока и на основе данных из админки задаёт смещение для css-свойства background.
P.S. Сам модуль выложил на github. Модуль не доделан. Из критичного: 1. Нет полноценного установщика - не создается highload-инфоблок; 2. Работа в админке довольно глючная, отчасти это связано с отсутствием событий на кнопки редактора (а они, к слову, генерируются js-кодом админки), и отчасти моим поверхностным знанием js; 3. Нужно бы сделать обработку события OnBeforeResizeImage, если всё же делать именно кроп на бекенде.
Поэтому, если будут предложения по улучшению - буду рад услышать советы или критику. На самом деле, только за этим и пишу этот длиннопост. И если у вас вдруг возникнет желание доделать/расширить/улучшить модуль, присылайте логин с github - добавлю в контрибьюторы
Олег Постоев написал: Ах да, и в таком случае, я его уже никуда выкладывать не стану
И напрасно. Выкладывая решения, пользу получают не только другие разработчики, но и вы сами. Если вы правда делаете качественные решения и не боитесь их показывать людям, то опенсорс будет работать на вас: один найдёт баг, второй его пофиксит, третий пришлёт пул-реквест с новой фичей. И я уже не говорю про +1 к репутации компании, которая сделала это решение.
Вот вам кул-стори...
«Админ-хелпер» — самый лучший генератор админских страниц для Битрикса. Первую пилотную версию давным-давно сделал Алексей Волков из компании «Цифровая палка». Спустя какое-то время в рамках одного из проектов в «Нотамедии» я сделал форк и мы капитально доработали его, исправив ошибки и добавив много нового функционала. Форк впоследствии вмержили в основной репозиторий. Так появилась вторая версия «Админ-хелпера».
Мораль: мы сделали в своём проекте то, что нам требовалось; потратили на это меньше времени, чем на разработку с нуля. Создатели первой версии «Админ-хелпера» получили хорошую пачку багфиксов и новых фич.
Опенсорс, в первую очередь, приносит пользу тем, кто им занимается. Нужно лишь правильно подойти к этому вопросу.
Никита Самохвалов, я вас понимаю и история клёвая. Но есть правила работы компании и нарушать я их не стану. Да, выложил сырую поделку, зато она рабочая и как минимум одному человеку пригодилась, не вижу причин что бы не пригодилась кому-то еще. Кому надо - доделает под себя, а может и так сгодится, я остановился на том моменте, когда инструмент свою задачу выполнял.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».