Буду очень рад, если мне кто-нибудь поможет. Сразу скажу я новичок и мне нужен более полный код, чтобы я смог его понять со своим начальным уровнем знаний php --- Добавлено --- У меня есть код отправки фотографий в БД и код их вывода. Мне добавить возможности: 1) Мне необходим скрипт обрезки фото по заданным размерам, например: 150px * 150px 2) Скрипт вывода фото из бд в формате: 2.1) HTML: <img src=""> 2.2) HTML: <div style="background: url();"></div> Вот мой скрипт, который есть на данный момент: PHP: <?php require "/includes/lgsn.php"; ?> <!DOCTYPE html> <html> <head> <title>Upload test</title> </head> <body> <?php echo 'Test uploader'; $connection = mysqli_connect("127.0.0.1", "/*Имя пользователя*/", "", "/*ДБ имя*/"); if ( ! $connection) { echo 'DB connection error!'; } $id = $_SESSION['ud_ae']['id']; ?> <?php if( isset($_POST['do_avatar']) ) { if( !empty( $_FILES['image']['name'] ) ) { if ( $_FILES['image']['error'] == 0 ) { if( substr($_FILES['image']['type'], 0, 5)=='image' ) { $image = file_get_contents( $_FILES['image']['tmp_name'] ); $image = mysql_escape_string( $image ); $query = "UPDATE `users` SET `avatar`='".$image."' WHERE id=$id "; mysqli_query($connection, $query); echo 'Аватар успешно загружен'; } } } else { echo 'Выберите изображение'; } } ?> <form enctype="multipart/form-data" method="POST" action="/avatar.php"> Изображение: <input type="file" name="image"> <input type="submit" name="do_avatar" value="Загрузить"> </form> <p>Ваш аватар</p> <?php $get_avatar = "SELECT `avatar` FROM `users` WHERE `id`=".$id; $res = mysqli_query($connection, $get_avatar); if ( mysqli_num_rows( $res ) > 0 ) while( $img = mysqli_fetch_array( $res ) ) echo '<img src="data:image/jpeg;base64,'.base64_encode($img['avatar']).'" />'; ?> <div style="width: 152px; height: 152px; background: url(); background-repeat: no-repeat; background-size: cover;"> </div> </body> </html> --- Добавлено ---
Я буду рад любым предложениям, связанным с реализацией данной идеи. Если это "не хорошая идея", можете подсказать как лучше это реализовать?
обычно изображения хранят на диске в папочке, в БД лишь ссылка к этим файлам... подходы уменьшения картинок разные, с своими + и - 1. "На лету". Хранить изображение как есть, при запросе динамически в памяти изменять размер (gd2, imagick) - отдавать изображение 2. Допустим знаем, что всегда только 150х150 размер нужен будет и оригинал. Тогда лучше генерить файлик превью и ложить рядом оригиналом. При запросе - отдавать оригинал или превью. 3. Каждый раз размер разный. Делаем как в 2, с той разницей, что предварительно проверяем - не был ли уже создан такой файл, если нет - то генерим превью заданого размера, если был - отдаем уже существующий возможно есть другие варианты.... и их комбинации 1. Минусы - будет конкретно тормозить при достаточном количестве отображения миниатюр, например галерея превьюх. Вплоть до занятия всей озу и вылета скрипта. Отсутствие кеширования (каждый раз будет генерить снова). Плюсы - доп место не занимает 2. Минусы - ограниченность одним, (2-3) размерами, доп место на диске. Плюсы - не будет грузить озу и скрипт, это обычная картинка и она будет кешироваться стандартно веб сервером 3. Минусы - место на диске, Плюсы - гибкость, пониженная нагрузка чем в 1, чуть выше чем в 2, кешируемость выбирайте что вам нужно и реализуйте
Для начала, извлеченные из базы данные необходимо запихнуть в ресурс изображения (image resource) вот этой функцией, чтобы можно было эту картинку обрабатывать встроенными методами PHP: $base_image = imagecreatefromstring ($img['avatar']); далее стоит узнать размеры картинки PHP: $w1 = imagesx($base_image); $h1 = imagesy($base_image); Создать новое изображение требуемых размеров с помощью вот этой функции PHP: $width = 200; $height = 200; $new_avatar = imagecreatetruecolor ($width , $height); Вычислить какую часть картинки стоит вырезать под новое соотношение сторон PHP: //Потребуются еще 6 значений, зависящих от размеров исходного и нового изображений $new_x = 0; // Координаты верхнего левого угла прямоугольника на новой картинке для вставки куска $new_y = 0; // из старой картинки (как правило верхний левый угол нового изображения) $old_x = ... // Координаты на старом изображении верхнего левого $old_y = ... // угла того куска, который будет вырезан $old_x = 0, $old_y = 0 $old_w = ... // Ширина и высота, вырезаемого $old_h = ... // на старом изображении куска $old_w = $w1, $old_h = $h1 Потом с помощью этой функции вырезать кусок с исходного изображения и поместить его в новое PHP: imagecopyresampled ( $new_avatar, $base_image, $new_x, $new_y, $old_x, $old_y, $width, $height, $old_w, $old_h); Потом финт ушами. Не нашел другого способа - может кто подскажет. Буферизуем вывод. Выводим полученное изображение в буфер этой функцией. Извлекаем новое изображение из буфера. Опустошаем и закрываем этот буфер. PHP: ob_start(); imagejpeg($new_avatar, null, 100); $avatar_image = ob_get_contents(); ob_end_clean(); Теперь его можно кодировать в base64 PHP: base64_encode($avatar_image)
@Maputo Это уже проходил, узнавал когда то даже получалось все, в базе храню названия изображения, его еще можно сохранять в другом названии, применить какие-то функции для изменения имени. Но с обрезкой проблемы были и еще остаются, но к этому чуть позже дойду, тогда задам вопрос, если не смогу разобраться сам)
Обрезание все таки или изменение размера изображения? Если не знаешь разницы, обратись к евреям, они тебе объяснят. Обрезание через Imagick: PHP: $img = new Imagick('photo.jpg'); // создаем объект $img->cropImage(150, 150,0,0); // обрезаем $img->writeImage('photo_150.jpg'); // сохраняем обрезанную картинку photo_150.jpg