Страница 1 из 1

ватермарк на изображениях - надо бы что-то сделать

Добавлено: 18 июл 2013, 21:11
marsden
Суть проблемы - ватермарк не масштабируется под размеры картинок. Например, марка имеет размер в 800 пикселей в горизонталь и должна размещаться в центре. Однако, если картинка будет меньше - то марка не поместится. Если же картинка будет сильно большой, то марка потеряется. Можно ли сделать на уровне системы такой алгоритм - при расположении по центру - устанавливать примерно 80% от ширины загружаемой картинки, при расположениях по углам - 60-70%. При этом марку можно сразу делать большой, чтобы ее больше приходилось сжимать, поскольку при растяжении качество будет страдать сильнее, чем при сжатии

Re: ватермарк на изображениях - надо бы что-то сделать

Добавлено: 19 июл 2013, 07:39
marsden
копание в исходниках проявило, что у Макса просто руки не дошли :)
Макс, предлагаю вариант, меня результат удовлетворил :)

Код: Выбрать все

# проверка размера файла ватермарки и создание времянки нужного размера
function mso_watermark_resize(&$r){
// параметром функции является массив для наложения ватермарки, передаваемый по ссылке
// внося в него изменения мы добиваемся нужного эффекта
// получаем размеры картинок
  list($sw,$sh)=getimagesize($r['source_image']);
  list($ww,$wh)=getimagesize($r['wm_overlay_path']);
  // вычисляем отношение ватермарки по правилу
  // - высота не более 25%
  // - ширина не более 80%
  // 2Макс - можно сделать и в опциях, чтобы более гибко было
  // пример расчета
  // размер картинки   sw   400
  //          sh   600
  // размер марки   ww   800
  //          wh   240
  //       
  // вычисляем максимальный размер марки по каждой стороне, не более 80% по ширине и 25% по высоте      
  //    mwW (sw*0,8)   320
  //    mwH (sh*0,25)   150
  // вычисляем отношения по каждой из сторон для новой искаженной марки      
  //    Dw (mwW/ww)   0,4
  //    Dh (mwH/wh)   0,625
  // берем меньшее значение      
  //    d   0,4
  // вычисляем размер марки      
  //    nwW (ww*d)   320
  //    nwH (wh*d)   96
  // новое имя ватермарки watermark1.png,
  // его после наложения можно убирать, можно оставлять, при каждой загрузке будет меняться
  $fileNew = preg_replace('/\.png$/i',"1.png",$r['wm_overlay_path']);
  $mwW=$sw*0.8;
  $mwH=$sh*0.25;
  $Dw=$mwW/$ww;
  $Dh=$mwH/$wh;
  $Dw>$Dh?$d=$Dh:$d=$Dw;
  $nwW=$ww*$d;
  $nwH=$wh*$d;
  // теперь ресайзим ватермарку
  $r_conf = array(
    'image_library' => 'gd2',
    'source_image' => $r['wm_overlay_path'],
    'new_image' => $fileNew,
    'maintain_ratio' => true,
    'width' => $nwW,
    'height' => $nwH,
  );

 $CI = & get_instance();
 $CI->image_lib->initialize($r_conf );

 if (!$CI->image_lib->resize()){
    echo '<div class="error">' . t('Изменение размера watermark:') . ' ' . $CI->image_lib->display_errors() . '</div>';
 }else{
    $r['wm_overlay_path']=$fileNew;
 }
}


это безобразие надо вставить в uploads.php перед mso_upload, затем в mso_upload при наложении ватермарки добавить вызов функции, итоговый кусок кода выглядит так

Код: Выбрать все

 
                                                $r_conf = array(
                                                'image_library' => 'gd2',
                                                'source_image' => $up_data['full_path'],
                                                'new_image' => $up_data['full_path'],
                                                'wm_type' => 'overlay',
                                                'wm_vrt_alignment' => $vrt,
                                                'wm_hor_alignment' => $hor,
                                                'wm_overlay_path' => $r['userfile_water_file'] //Жёстко, а что делать?
                                        );
                                       // меняем размер ватермарки
               mso_watermark_resize($r_conf);

                                        $CI->image_lib->initialize($r_conf );
                                        if (!$CI->image_lib->watermark())
                                                echo '<div class="error">' . t('Водяной знак:') . ' ' . $CI->image_lib->display_errors() . '</div>';

Мелким недостатком является то, что в uploads создается watermark1.png, мне его удалять лень, если честно, особо не мешается. А возникает он от того, что оригинальную ватермарку мы не ресайзим, работаем с копией. Таким образом убиваем сразу двух зайцев - корректная вставка и высокое качество.

Надеюсь, это будет принято и войдет в следующий релиз. :)

Re: ватермарк на изображениях - надо бы что-то сделать

Добавлено: 14 янв 2017, 17:32
Slonne
не расстраивайся, что твои наработки не включены в новую версию движка. По работе с изображениями сейчас идёт работа http://maxsite.org/page/novye-vozmozhno ... nij-zapisi вот пост от 22 декабря 2016 года, должно работать лучше и правильней, посмотрим.