Привет all. Такая проблема. Код из файла приведенного ниже отвечает за ресайз изображения "налету", при его публикации. Суть в том, что я никак не могу разобраться - как сделать фксированную ширину, а высота чтобы изменялась пропорционально. Помогите, кто может. p.s. кусок кода, отвечающий за эту фичу - со строки 51 p.p.s. двигло - PHPMars (типа - обрубок инстаграма PHP: <?php include '../../core/init.php'; Security::csrf_page_protection_check('dynamic'); User::check_permission(0); if($_POST['type'] == 'post') { /* Define some variables */ $allowed_extensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp']; $photo = (empty($_FILES['photo']['name']) == false) ? true : false; $content = filter_var($_POST['content'], FILTER_SANITIZE_STRING); /* Error checks */ if(strlen($content) > 256) { $_SESSION['info'][] = $language->home->info_message->content_length; } if(!$photo) { $_SESSION['error'][] = $language->home->error_message->invalid_photo; } if($photo) { $photo_file_name = $_FILES['photo']['name']; $photo_file_extension = explode('.', $photo_file_name); $photo_file_extension = strtolower(end($photo_file_extension)); $photo_file_temp = $_FILES['photo']['tmp_name']; $photo_file_size = $_FILES['photo']['size']; if($_FILES['photo']['error']) { $_SESSION['error'][] = $language->profile->error_message->invalid_photo; redirect(); } list($photo_width, $photo_height) = getimagesize($photo_file_temp); if(!is_writeable(ROOT . PHOTOS_ROUTE) || !is_writeable(ROOT . PHOTOS_THUMBS_ROUTE)) { $_SESSION['error'][] = $account->type > 0 ? $language->home->error_message->not_writeable : $language->global->error_message->system_issues; } if(in_array($photo_file_extension, $allowed_extensions) !== true) { $_SESSION['error'][] = $language->global->error_message->invalid_file_type; } if($photo_width < 150 || $photo_height < 150) { $_SESSION['error'][] = $language->profile->error_message->small_photo; } if($photo_file_size > $settings->photos_max_size) { $_SESSION['error'][] = sprintf($language->global->error_message->invalid_image_size, formatBytes($settings->photos_max_size)); } } // ИЗМЕНЕНИЕ РАЗМЕРА ИЗОБРАЖЕНИЯ "НАЛЕТУ" ПРИ ЗАГРУЗКЕ if(empty($_SESSION['error'])) { /* Generate new name */ $photo_new_name = md5(time().rand()) . '.' . $photo_file_extension; /* Make a thumbnail and upload the original */ resize($photo_file_temp, ROOT . PHOTOS_ROUTE . $photo_new_name, '800', '600'); move_uploaded_file($photo_file_temp, ROOT . PHOTOS_THUMBS_ROUTE . $photo_new_name); /* Execute query */ $database->query("INSERT INTO `photos` (`user_id`, `name`, `content`, `timestamp`) VALUES ({$account_user_id}, '{$photo_new_name}', '{$content}', UNIX_TIMESTAMP())"); } redirect(); } elseif($_POST['type'] == 'repost') { /* Get the photo id and some details */ $photo_id = (int) $_POST['photo_id']; $photo = Database::get('*', 'photos', ['photo_id' => $photo_id]); /* Get the extension of the photo */ $explode = explode('.', $photo->name); $photo_file_extension = end($explode); /* Generate a new name */ $photo_new_name = md5(time().rand()) . '.' . $photo_file_extension; /* Duplicate the image */ copy(ROOT.PHOTOS_ROUTE.$photo->name, ROOT.PHOTOS_ROUTE.$photo_new_name); copy(ROOT.PHOTOS_THUMBS_ROUTE.$photo->name, ROOT.PHOTOS_THUMBS_ROUTE.$photo_new_name); // TODO: ERROR CHECKING. Database::insert('photos', [ 'user_id' => $account_user_id, 'name' => $photo_new_name, 'content' => sprintf($language->photo->repost->content, '@' . Database::simple_get('username', 'users', ['user_id' => $photo->user_id])), 'timestamp' => time() ]); Notifications::insert($account_user_id, $photo->user_id, 'REPOST', $photo->photo_id); Response::json($language->photo->success_message->repost, 'success'); } elseif($_POST['type'] == 'delete') { /* Get the photo id */ $photo_id = (int) $_POST['photo_id']; /* Check if the photo is bound to the specific account */ $photo_user_id = Database::simple_get('user_id', 'photos', ['photo_id' => $photo_id]); /* Remove the photo */ if($photo_user_id == $account_user_id) { Photos::delete_photo($photo_id); echo 'deleted'; } else { echo 'not-deleted'; } } elseif($_POST['type'] == 'like') { /* Get the photo id */ $target_id = (int) $_POST['photo_id']; /* Check if the like is set or not already */ $like_status = Database::simple_get('id', 'associations', ['first_id' => $account_user_id, 'second_id' => $target_id, 'type' => 'PHOTO', 'sub_type' => 'LIKE']); /* Remove the like from the database */ if($like_status) { $database->query("DELETE FROM `associations` WHERE `type` = 'PHOTO' AND `sub_type` = 'LIKE' AND `first_id` = {$account_user_id} AND `second_id` = {$target_id}"); echo 'deleted'; } /* Insert the like in the database */ else { /* Get the user_id of the photo owner */ $photo_user_id = Database::simple_get('user_id', 'photos', ['photo_id' => $target_id]); $database->query("INSERT INTO `associations` (`type`, `sub_type`, `first_id`, `second_id`) VALUES ('PHOTO', 'LIKE', {$account_user_id}, {$target_id})"); if($account_user_id != $photo_user_id) { Notifications::insert($account_user_id, $photo_user_id, 'PHOTO_LIKE', $target_id); } echo 'inserted'; } } ?>
PHP: $y = ceil ( ( $imagesy = imagesy ( $logo ) ) / ( $imagesx / $this -> size ) ); $this -> im = imagecreatetruecolor ( $this -> size, $y ); imagecopyresampled ( $this -> im, $logo, 0,0,0,0, $this -> size, $y, $imagesx, $imagesy ); задаем X длину $this -> size для нового размера имг. Узнаем пропорциональную ширину Y создаем новую палитру будущего имг. ресамплируем имг на новую палитру, сохраняя прозрачность фона и прочее. Подставь свои переменные. --- Добавлено --- Что - то не похоже
Если честно - понял только поверхностно... простите, неумеку начинающего... PHPMars - он и есть. Официальный дистр от разработчика.
Сайт вот: http://zub.sibru.com/ Во всем в коде разобрался. А с главным - никак не разберусь. Чтобы картинка загружаемая менялась по ширине, но не по высоте... --- Добавлено --- В каком смысле - следовательно? Я его не писал. Это готовая CMS. И что противно - здесь куча всего на кучу другую ссылается в файлах. Хотя конкретно вот этот момент с ресайзом - по ходу только к одному файлу относится - photos.php Дистр можете взять отсюда же: http://zub.sibru.com/phpmars_1.0.9.zip
В двух переменных запутался... $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: $photo_file_temp = ceil ( ( $imagesy = imagesy ( $photo_new_name ) ) / ( $imagesx / $this -> size ) ); $photo_file_temp -> im = imagecreatetruecolor ( $photo_file_temp -> size, $photo_file_temp ); imagecopyresampled ( -> im, $photo_file_temp, 0,0,0,0, $photo_new_name -> size, $photo_file_temp, $imagesx, $imagesy ); move_uploaded_file($photo_new_name, ROOT . PHOTOS_THUMBS_ROUTE . $photo_new_name);