Чаще всего картинки для галерей обрезают до центрального квадрата или масштабируют по большей стороне. Я хочу рассказать ещё об одном способе, основная идея которого - миниатюры с одинаковой площадью. Сразу оговорюсь, что есть одно ограничение: сильно вытянутые картинки всё-таки придётся масштабировать по большей стороне, и их площадь будет меньше остальных.
Демо:
http://skripnik.com/gallery/ Итак, допустим, что:
- w_src и h_src - ширина и высота исходной картинки
- square - сторона квадрата, в который нужно её вписать
- ratio - пропорции картинки, то есть w_src / h_src
- ratio_max - максимальные пропорции, после которых картинка масштабируется по большей стороне (я беру 1,6)
- w_thumb и h_thumb - ширина и высота миниатюры
Алгоритм в этом случае таков:
if (ratio > ratio_max) {
w_thumb = square
h_thumb = w_thumb / ratio
}
elseif (ratio < 1 / ratio_max) {
h_thumb = square
w_thumb = h_thumb * ratio
}
else {
w_thumb = sqrt(square * square / ratio_max * ratio))
h_thumb = w_thumb / ratio
}
Хочу обратить внимание на две вещи:
- Масштабирование теряет смысл, когда площадь миниатюры получается больше площади исходной картинки.
- Получившиеся значения w_thumb и h_thumb будут, скорее всего, дробными.