За последние 24 часа нас посетили 126722 программиста и 6620 роботов. Сейчас ищут 2266 программистов ...

Ресайз изображений - как решить?

Тема в разделе "PHP для новичков", создана пользователем mleit, 9 окт 2018.

  1. mleit

    mleit Новичок

    С нами с:
    9 окт 2018
    Сообщения:
    4
    Симпатии:
    0
    Привет all.
    Такая проблема. Код из файла приведенного ниже отвечает за ресайз изображения "налету", при его публикации. Суть в том, что я никак не могу разобраться - как сделать фксированную ширину, а высота чтобы изменялась пропорционально.
    Помогите, кто может.
    p.s. кусок кода, отвечающий за эту фичу - со строки 51
    p.p.s. двигло - PHPMars (типа - обрубок инстаграма ;)


    PHP:
    1. <?php
    2. include '../../core/init.php';
    3. Security::csrf_page_protection_check('dynamic');
    4. User::check_permission(0);
    5.  
    6. if($_POST['type'] == 'post') {
    7.     /* Define some variables */
    8.     $allowed_extensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp'];
    9.     $photo = (empty($_FILES['photo']['name']) == false) ? true : false;
    10.     $content = filter_var($_POST['content'], FILTER_SANITIZE_STRING);
    11.  
    12.     /* Error checks */
    13.     if(strlen($content) > 256) {
    14.         $_SESSION['info'][] = $language->home->info_message->content_length;
    15.     }
    16.     if(!$photo) {
    17.         $_SESSION['error'][] = $language->home->error_message->invalid_photo;
    18.     }
    19.  
    20.     if($photo) {
    21.         $photo_file_name        = $_FILES['photo']['name'];
    22.         $photo_file_extension    = explode('.', $photo_file_name);
    23.         $photo_file_extension    = strtolower(end($photo_file_extension));
    24.         $photo_file_temp        = $_FILES['photo']['tmp_name'];
    25.         $photo_file_size        = $_FILES['photo']['size'];
    26.  
    27.         if($_FILES['photo']['error']) {
    28.             $_SESSION['error'][] = $language->profile->error_message->invalid_photo;
    29.             redirect();
    30.         }
    31.         list($photo_width, $photo_height)    = getimagesize($photo_file_temp);
    32.  
    33.         if(!is_writeable(ROOT . PHOTOS_ROUTE) || !is_writeable(ROOT . PHOTOS_THUMBS_ROUTE)) {
    34.             $_SESSION['error'][] = $account->type > 0 ? $language->home->error_message->not_writeable : $language->global->error_message->system_issues;
    35.         }
    36.         if(in_array($photo_file_extension, $allowed_extensions) !== true) {
    37.             $_SESSION['error'][] = $language->global->error_message->invalid_file_type;
    38.         }
    39.         if($photo_width < 150 || $photo_height < 150) {
    40.             $_SESSION['error'][] = $language->profile->error_message->small_photo;
    41.         }
    42.         if($photo_file_size > $settings->photos_max_size) {
    43.             $_SESSION['error'][] = sprintf($language->global->error_message->invalid_image_size, formatBytes($settings->photos_max_size));
    44.         }
    45.  
    46.     }
    47.  
    48.  
    49.  
    50.  
    51. // ИЗМЕНЕНИЕ РАЗМЕРА ИЗОБРАЖЕНИЯ "НАЛЕТУ" ПРИ ЗАГРУЗКЕ
    52.  
    53.     if(empty($_SESSION['error'])) {
    54.         /* Generate new name  */
    55.         $photo_new_name = md5(time().rand()) . '.' . $photo_file_extension;
    56.  
    57.         /* Make a thumbnail and upload the original */
    58.         resize($photo_file_temp, ROOT . PHOTOS_ROUTE . $photo_new_name, '800', '600');
    59.         move_uploaded_file($photo_file_temp, ROOT . PHOTOS_THUMBS_ROUTE . $photo_new_name);
    60.  
    61.         /* Execute query */
    62.         $database->query("INSERT INTO `photos` (`user_id`, `name`, `content`, `timestamp`) VALUES ({$account_user_id}, '{$photo_new_name}', '{$content}', UNIX_TIMESTAMP())");
    63.     }
    64.  
    65.     redirect();
    66. }
    67.  
    68.  
    69.  
    70. elseif($_POST['type'] == 'repost') {
    71.  
    72.     /* Get the photo id and some details */
    73.     $photo_id = (int) $_POST['photo_id'];
    74.     $photo = Database::get('*', 'photos', ['photo_id' => $photo_id]);
    75.  
    76.     /* Get the extension of the photo */
    77.     $explode = explode('.', $photo->name);
    78.     $photo_file_extension = end($explode);
    79.  
    80.     /* Generate a new name */
    81.     $photo_new_name = md5(time().rand()) . '.' . $photo_file_extension;
    82.  
    83.     /* Duplicate the image */
    84.     copy(ROOT.PHOTOS_ROUTE.$photo->name, ROOT.PHOTOS_ROUTE.$photo_new_name);
    85.     copy(ROOT.PHOTOS_THUMBS_ROUTE.$photo->name, ROOT.PHOTOS_THUMBS_ROUTE.$photo_new_name);
    86.  
    87.     // TODO: ERROR CHECKING.
    88.  
    89.     Database::insert('photos', [
    90.         'user_id' => $account_user_id,
    91.         'name' => $photo_new_name,
    92.         'content' => sprintf($language->photo->repost->content, '@' . Database::simple_get('username', 'users', ['user_id' => $photo->user_id])),
    93.         'timestamp' => time()
    94.     ]);
    95.  
    96.     Notifications::insert($account_user_id, $photo->user_id, 'REPOST', $photo->photo_id);
    97.  
    98.     Response::json($language->photo->success_message->repost, 'success');
    99. }
    100.  
    101.  
    102. elseif($_POST['type'] == 'delete') {
    103.  
    104.     /* Get the photo id */
    105.     $photo_id = (int) $_POST['photo_id'];
    106.  
    107.     /* Check if the photo is bound to the specific account */
    108.     $photo_user_id = Database::simple_get('user_id', 'photos', ['photo_id' => $photo_id]);
    109.  
    110.     /* Remove the photo */
    111.     if($photo_user_id == $account_user_id) {
    112.  
    113.         Photos::delete_photo($photo_id);
    114.  
    115.         echo 'deleted';
    116.     }
    117.  
    118.     else {
    119.         echo 'not-deleted';
    120.     }
    121.  
    122. }
    123.  
    124. elseif($_POST['type'] == 'like') {
    125.  
    126.     /* Get the photo id */
    127.     $target_id = (int) $_POST['photo_id'];
    128.  
    129.     /* Check if the like is set or not already */
    130.     $like_status = Database::simple_get('id', 'associations', ['first_id' => $account_user_id, 'second_id' => $target_id, 'type' => 'PHOTO', 'sub_type' => 'LIKE']);
    131.  
    132.     /* Remove the like from the database */
    133.     if($like_status) {
    134.         $database->query("DELETE FROM `associations` WHERE `type` = 'PHOTO' AND `sub_type` = 'LIKE' AND `first_id` = {$account_user_id} AND `second_id` = {$target_id}");
    135.         echo 'deleted';
    136.     }
    137.  
    138.     /* Insert the like in the database */
    139.     else {
    140.         /* Get the user_id of the photo owner */
    141.         $photo_user_id = Database::simple_get('user_id', 'photos', ['photo_id' => $target_id]);
    142.  
    143.         $database->query("INSERT INTO `associations` (`type`, `sub_type`, `first_id`, `second_id`) VALUES ('PHOTO', 'LIKE', {$account_user_id}, {$target_id})");
    144.  
    145.         if($account_user_id != $photo_user_id) {
    146.             Notifications::insert($account_user_id, $photo_user_id, 'PHOTO_LIKE', $target_id);
    147.         }
    148.  
    149.         echo 'inserted';
    150.     }
    151. }
    152. ?>
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.840
    Симпатии:
    1.338
    Адрес:
    Лень
    PHP:
    1. $y = ceil ( ( $imagesy = imagesy ( $logo ) ) / ( $imagesx / $this -> size ) );
    2.        
    3.        $this -> im = imagecreatetruecolor ( $this -> size, $y );
    4.        
    5.        imagecopyresampled ( $this -> im, $logo, 0,0,0,0, $this -> size, $y, $imagesx, $imagesy );
    1. задаем X длину $this -> size для нового размера имг. Узнаем пропорциональную ширину Y
    2. создаем новую палитру будущего имг.
    3. ресамплируем имг на новую палитру, сохраняя прозрачность фона и прочее.
    4. Подставь свои переменные.
    --- Добавлено ---
    Что - то не похоже
     
  3. mleit

    mleit Новичок

    С нами с:
    9 окт 2018
    Сообщения:
    4
    Симпатии:
    0
    Если честно - понял только поверхностно... простите, неумеку начинающего...

    PHPMars - он и есть. Официальный дистр от разработчика.
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.840
    Симпатии:
    1.338
    Адрес:
    Лень
    как код ваш написали следовательно?
     
  5. mleit

    mleit Новичок

    С нами с:
    9 окт 2018
    Сообщения:
    4
    Симпатии:
    0
    Сайт вот: http://zub.sibru.com/
    Во всем в коде разобрался. А с главным - никак не разберусь. Чтобы картинка загружаемая менялась по ширине, но не по высоте...
    --- Добавлено ---
    В каком смысле - следовательно? Я его не писал. Это готовая CMS. И что противно - здесь куча всего на кучу другую ссылается в файлах. Хотя конкретно вот этот момент с ресайзом - по ходу только к одному файлу относится - photos.php

    Дистр можете взять отсюда же: http://zub.sibru.com/phpmars_1.0.9.zip
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.840
    Симпатии:
    1.338
    Адрес:
    Лень
    Скаченный софт дерьмо.
    --- Добавлено ---
    58 строка место нее, код с пояснением с моего поста
     
  7. mleit

    mleit Новичок

    С нами с:
    9 окт 2018
    Сообщения:
    4
    Симпатии:
    0
    В двух переменных запутался... $photo_file_temp и $photo_new_name... Ругается на третью строку: Parse error: syntax error, unexpected '->' (T_OBJECT_OPERATOR) in [...]/zub.sibru.com/processing/process/photo.php on line 68

    PHP:
    1. $photo_file_temp = ceil ( ( $imagesy = imagesy ( $photo_new_name ) ) / ( $imagesx / $this -> size ) );
    2.      
    3.        $photo_file_temp -> im = imagecreatetruecolor ( $photo_file_temp -> size, $photo_file_temp );
    4.      
    5.        imagecopyresampled (  -> im, $photo_file_temp, 0,0,0,0, $photo_new_name -> size, $photo_file_temp, $imagesx, $imagesy );
    6.        move_uploaded_file($photo_new_name, ROOT . PHOTOS_THUMBS_ROUTE . $photo_new_name);
     
  8. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.840
    Симпатии:
    1.338
    Адрес:
    Лень
    --- Добавлено ---
    ответ был дан на конкретный вопрос