Обрезка аватаров под нужный размер

Уменьшение с обрезкой вместо простого уменьшения по одному из ребер

#1 16 июня 2011 в 15:33
Сейчас аватары просто уменьшаются в соответствии с заданным размером. И соотношения высоты/ширины не изменяются, поэтому получаются разновеликие аватары, и в различных модулях это смотрится довольно коряво. Юзеры же не будут подбирать строго квадратные или с заданными пропорциями сторон фотки. В JomSocial (может, и еще где, не знаю), реализовано поудобнее — фотки не просто уменьшаются под аватар, они еще и обрезаются в соответствии с заданным размером. И обрезка происходит не с угла, типа отрезать все лишнее, а по центру, то есть "отсеченных" голов или ног на аватарках не получается. И все аватарки строго заданного размера.
Хм… С превьюшками фоток дела в этом плане получше обстоят.
#2 17 июня 2011 в 11:59
Тоже интересен данный вопрос… Кто поделится?
#3 17 июня 2011 в 12:32
Till, EVV, создайте тикет в багтрекере — ибо даже если поделиться, потом это придется под каждый релиз еще подгонять после обновления. Мысль здравая…
#4 17 июня 2011 в 12:44
/components/users/frontend.php ищем (~903 строка):
  1.  
  2. @img_resize($uploadfile, $uploadthumb, $smallw, $smallw);
  3.  
добавляем параметр:
  1.  
  2. @img_resize($uploadfile, $uploadthumb, $smallw, $smallw, $is_square=true);
  3.  
маленький аватар будет загружаться квадратным (если ориентация изображения горизонтальная, вырезается из центра, если вертикальная сверху /*шанс что голова окажется в этом месте больше)))*/)
#5 17 июня 2011 в 14:26
Я зделал вот так:
  1. @img_resize($uploadfile, $uploadthumb, $smallw, $smallw, true);
Так было в 1.6.2. Только я непонимаю зачем это убрали.
А в SE-4 вообще круто зделали. Там после загрузки большого аватара, можно зделать маленький. Перемещая, увеличивая или уменьшая квадратик на большом аватаре. Всё что внутри квадратика, будет маленьким аватаром. Остальное обрезается.
#6 17 июня 2011 в 15:40
Кстати, • Mike •, как правильно в тпл шаблоне указать нужный размер аватара?
вот кусок кода для примера:
  1. {if $cfg.avatar}
  2. <a href="/users/{$id}/avatar.html">{$avatar}</a>
  3. {/if}
#7 17 июня 2011 в 15:52
ну в этом примере уже никак, только в коде до передачи в смарти…
или одним из способов как тут например топик
#8 17 июня 2011 в 16:49

одним из способов как тут например топик

• Mike •
Пробую как описано здесь, но делаю что то не так...
выдает ошибку синтаксис эрор...

файл usercore добавляем новую функцию

  1.  
  2. function usrImageHS($user_id, $usr_imageurl, $width='100px', $height='250px'){
  3. if ($usr_imageurl && @file_exists($_SERVER['DOCUMENT_ROOT'].'/images/users/avatars/'.$usr_imageurl)){
  4. return '';
  5. }
  6. }
  7.  
в файле вашего модуля заменяем блок
  1.  
  2. $usr['avatar'] = usrImageNOdb($usr['id'], 'medium', $usr['imageurl'], $usr['is_deleted']);
  3. $pattern = "//i";
  4. $replacement = '';
  5. $usr['avatar'] = preg_replace($pattern, $replacement, $usr['avatar']);
  6.  
на простой вызов новой функции:
  1.  
  2. $usr['avatar'] = usrImageHS($usr['id'], $usr['imageurl'], $width='100px', $height='250px');
  3.  

Mike


можешь подсказать как прописать размеры аватара в такой записи?
  1. {if $cfg.avatar}
  2. <a href="/users/{$id}/avatar.html">{$avatar}</a>
  3. {/if}
я в этих квадратных и фигурных скобках ничего не понимаю…
#9 17 июня 2011 в 21:48
как один из вариантов альтернативный модуль — это, если, код модуля — тогда можно обратится в свойствах css как module_id_XX a img {width: 00px; height: 00px;}
если, это компонент, то кое-что придётся исправить в ядре, чтобы добиться того же самого эффекта…
#10 18 июня 2011 в 18:04
сделал немного проще
  1. {if $cfg.avatar}
  2. <span class="avatar">
  3. <a href="/users/{$id}/avatar.html">{$avatar}</a>
  4. </span>
  5. {/if}
и в стилях добавил нужное условие)
#11 7 октября 2012 в 07:29
А если есть желание, чтобы миниатюры загружаемых фото (не только аватары) и вертикальные обрезались по середине, нужно открыть файл /includes/graphic.inc.php найти в нем код:
  1. // вырезаем квадратную верхушку по y,
  2. if ($new_width<$new_height)
  3. imagecopyresampled($idest, $isrc, 0, 0, 0, 0, $maxwidth, $maxwidth, min($new_width,$new_height), min($new_width,$new_height));
и заменить на:
  1. // вырезаем квадратную серединку по y,
  2. if ($new_width<$new_height)
  3. imagecopyresampled($idest, $isrc, 0, 0, 0, round((max($new_width,$new_height)-min($new_width,$new_height))/2), $maxwidth, $maxwidth, min($new_width,$new_height), min($new_width,$new_height));
Рискуем порубать головы, но лично мне такой вариант больше нравится. Еще бы найти время разобраться, как ползунок прикрутить…
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.