Хотел сегодня рассказать вам, а небольшом хаке для DLE. Система создания уменьшенной копии картинки для новости происходит следующим образом, к примеру, у нас есть фотография размерами 1024*768, в админпанели в настройках стоит параметр уменьшения картинки, скажем, до 200 пикселей. Это говорит о том, что самая большая сторона фотографии после уменьшения станет равной 200 пикселям, а другая пропорционально уменьшится ещё до более низкого значения. Мне не так давно для одного из проектов потребовалось, чтобы уменьшенная копия рисунка стала квадратной. Чтобы и высота, и ширина имели равные стороны.
Скажем 200*200. Для этого пришлось изменить класс для уменьшения картинок, а именно переписать всего лишь одну функцию.

Приведу код. Откроем файл engine/inc/makethumb.php
И найдём там функцию:

<!-- code1 -->
<!-- ecode1 -->
function size_auto($size = 100) {
    global $gd_version;

    if ($this->img["lebar"] < $size AND $this->img["tinggi"] < $size ) {
        $this->img["lebar_thumb"]  = $this->img["lebar"];
        $this->img["tinggi_thumb"] = $this->img["tinggi"];
     return 0;
    } elseif ($this->img["lebar"] >= $this->img["tinggi"]) {
        $this->img["lebar_thumb"] = $size;
        $this->img["tinggi_thumb"] = ($this->img["lebar_thumb"]/$this->img["lebar"])*$this->img["tinggi"];
    } else {
        $this->img["tinggi_thumb"] = $size;
        $this->img["lebar_thumb"] = ($this->img["tinggi_thumb"]/$this->img["tinggi"])*$this->img["lebar"];
    }

if($gd_version==1) {
    $this->img["des"] = imagecreate($this->img["lebar_thumb"],$this->img["tinggi_thumb"]);
    @imagecopyresized ($this->img["des"], $this->img["src"], 0, 0, 0, 0, $this->img["lebar_thumb"], $this->img["tinggi_thumb"], $this->img["lebar"], $this->img["tinggi"]);
  } elseif($gd_version==2) {
     $this->img["des"] = imagecreatetruecolor($this->img["lebar_thumb"],$this->img["tinggi_thumb"]);
    @imagecopyresampled ($this->img["des"], $this->img["src"], 0, 0, 0, 0, $this->img["lebar_thumb"], $this->img["tinggi_thumb"], $this->img["lebar"], $this->img["tinggi"]);
  }

    $this->img["src"] = $this->img["des"];
    return 1;
} <!-- code2 -->
<!-- ecode2 -->

и заменим на:

<!-- code1 -->
<!-- ecode1 --> function size_auto($size = 100) {
    
    global $gd_version;
    
  // lebar - x
  // tinngi - y

    if ($this -> img["lebar"] < $size AND $this->img["tinggi"] < $size ) {
        $this -> img["lebar_thumb"]  = $this->img["lebar"];
        $this -> img["tinggi_thumb"] = $this->img["tinggi"];
        return 0;
        
    } else {
        $this -> img["tinggi_thumb"] = $size;
        $this -> img["lebar_thumb"]  = $size;
    }

    
  // Если библиотека версии 1 используем более простое обрезание
    if($gd_version == 1) {
        
      //создаём новое изображение
         $this->img["des"] = imagecreate($this->img["lebar_thumb"], $this->img["tinggi_thumb"]);
        
      // Вырезаем участок рисунка
         if ($this->img["lebar_thumb"] > $this->img["tinggi_thumb"])
             @imagecopyresized($this->img["des"], $this->img["src"], 0, 0,
                          round((max($this->img["lebar"], $this->img["tinggi"]) - min($this->img["lebar"], $this->img["tinggi"]))/2),
                          0, $this->img["lebar_thumb"], $this->img["tinggi_thumb"],
                          min($this->img["lebar"], $this->img["tinggi"]), min($this->img["lebar"],$this->img["tinggi"]));

         if ($this->img["lebar_thumb"] < $this->img["tinggi_thumb"])
             @imagecopyresized($this->img["des"], $this->img["src"], 0, 0, 0, 0, $this->img["lebar_thumb"], $this->img["tinggi_thumb"],
                          min($this->img["lebar"], $this->img["tinggi"]), min($this->img["lebar"], $this->img["tinggi"]));
                          
         if ($this->img["lebar_thumb"] == $this->img["tinggi_thumb"])
             @imagecopyresized($this->img["des"], $this->img["src"], 0, 0, 0, 0, $this->img["lebar_thumb"], $this->img["tinggi_thumb"], $this->img["lebar"], $this->img["tinggi"]);
          
    
  // Если библиотека версии 2 используем более сложное обрезание
    } elseif($gd_version == 2) {
        
          //создаём новое изображение
            $this->img["des"] = imagecreatetruecolor($this->img["lebar_thumb"],$this->img["tinggi_thumb"]);
            
       // Вырезаем участок рисунка
         if ($this->img["lebar_thumb"] > $this->img["tinggi_thumb"])
             @imagecopyresampled ($this->img["des"], $this->img["src"], 0, 0,
                          round((max($this->img["lebar"], $this->img["tinggi"]) - min($this->img["lebar"], $this->img["tinggi"]))/2),
                          0, $this->img["lebar_thumb"], $this->img["tinggi_thumb"],
                          min($this->img["lebar"], $this->img["tinggi"]), min($this->img["lebar"],$this->img["tinggi"]));

         if ($this->img["lebar_thumb"] < $this->img["tinggi_thumb"])
             @imagecopyresampled ($this->img["des"], $this->img["src"], 0, 0, 0, 0, $this->img["lebar_thumb"], $this->img["tinggi_thumb"],
                          min($this->img["lebar"], $this->img["tinggi"]), min($this->img["lebar"], $this->img["tinggi"]));
                          
         if ($this->img["lebar_thumb"] == $this->img["tinggi_thumb"])
             @imagecopyresampled ($this->img["des"], $this->img["src"], 0, 0, 0, 0, $this->img["lebar_thumb"], $this->img["tinggi_thumb"], $this->img["lebar"], $this->img["tinggi"]);
    }

    $this->img["src"] = $this->img["des"];
    return 1;
} <!-- code2 -->
<!-- ecode2 -->


Теперь все уменьшенные копии будут получаться квадратными.


Написал Alexander, в Хаки. , просмотров 105
Рейтинг: 

Подробнее   Комментарии (0)

Добавить отзыв

Включите эту картинку для отображения кода безопасности
обновить код




Регистрация
Введите логин:
и пароль:



Партнеры
Опрос
Как вам новый дизайн?
Нравится
Нормально
Так себе
Не нравится