- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
VK приобрела 70% в структуре компании-разработчика red_mad_robot
Которая участвовала в создании RuStore
Оксана Мамчуева
Что делать, если ваша email-рассылка попала в спам
10 распространенных причин и решений
Екатерина Ткаченко
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Речь о скрипте простой фото галереи. Делал по видео уроку, в котором автор объяснил как работает весь код, кроме функции img_resize, пришлось недостающую функцию взять с интернета. В итоге код полностью рабочий, но как работает эта функция мне не до конца понятно.
Два дня уже мучаюсь, с расшифровкой вот этой строки
$format = strtolower(substr($size['mime'], strpos($size['mime'], '/') + 1));
Помогите разобраться что означает '/' и +1?
Речь о скрипте простой фото галереи. Делал по видео уроку, в котором автор объяснил как работает весь код, кроме функции img_resize, пришлось недостающую функцию взять с интернета. В итоге код полностью рабочий, но как работает эта функция мне не до конца понятно.
Два дня уже мучаюсь, с расшифровкой вот этой строки
$format = strtolower(substr($size['mime'], strpos($size['mime'], '/') + 1));
Помогите разобраться что означает '/' и +1?
Я так понимаю, в $size['mime'] хранится формат данных (например для gif он может быть таким: image/gif). Вся эта конструкция возвращает всё, что после слеша, опять же в случае с image/gif это будет gif.
Иван НСК, поиск вхождения с /
Я так понимаю, в $size['mime'] хранится формат данных (например для gif он может быть таким: image/gif). Вся эта конструкция возвращает всё, что после слеша, опять же в случае с image/gif это будет gif.
А +1 что дает?
Вот весь код.
Function.php
function get_gallery() {
$images = array();
$handle = opendir('img_big');
if($handle != false)
{
while(false !== ($file = readdir($handle)))
{
if($file != '.' && $file != '..')
$images[] = $file;
}
closedir ($handle);
}
return $images;
}
function upload_image($file)
{
if(!check_upload($file))
return false;
else
{
copy($file['tmp_name'], 'img_big/' . $file['name']);
img_resize($file['tmp_name'], 'img_small/' . $file['name'], 250, 250);
return true;
}
}
function check_upload($file)
{
if($file['name'] == '')
{
return false;
}
if($file['size'] > 1000000)
{
return false;
}
$types = array('image/jpg', 'image/jpeg', 'image/png', 'image/gif');
if(!in_array($file['type'], $types))
{
return false;
}
return true;
}
function img_resize($src, $dest, $width, $height, $rgb = 0xFFFFFF, $quality = 100) {
if (!file_exists($src)) {
return false;
}
$size = getimagesize($src);
if ($size === false) {
return false;
}
$format = strtolower(substr($size['mime'], strpos($size['mime'], '/') + 1));
$icfunc = 'imagecreatefrom'.$format;
if (!function_exists($icfunc)) {
return false;
}
$x_ratio = $width / $size[0];
$y_ratio = $height / $size[1];
if ($height == 0) {
$y_ratio = $x_ratio;
$height = $y_ratio * $size[1];
} elseif ($width == 0) {
$x_ratio = $y_ratio;
$width = $x_ratio * $size[0];
}
$ratio = min($x_ratio, $y_ratio);
$use_x_ratio = ($x_ratio == $ratio);
$new_width = $use_x_ratio ? $width : floor($size[0] * $ratio);
$new_height = !$use_x_ratio ? $height : floor($size[1] * $ratio);
$new_left = $use_x_ratio ? 0 : floor(($width - $new_width) / 2);
$new_top = !$use_x_ratio ? 0 : floor(($height - $new_height) / 2);
$isrc = $icfunc($src);
$idest = imagecreatetruecolor($width, $height);
imagefill($idest, 0, 0, $rgb);
imagecopyresampled($idest, $isrc, $new_left, $new_top, 0, 0, $new_width, $new_height, $size[0], $size[1]);
imagejpeg($idest, $dest, $quality);
imagedestroy($isrc);
imagedestroy($idest);
return true;
}
index.php
include_once 'function.php';
if(isset($_FILES['fupload']))
{
if(upload_image($_FILES['fupload']))
{
header('location: index.php');
exit();
}
else
{
exit('Ошибка при загрузке файла!');
}
}
$images = get_gallery();
?>
<html><body>
<h2>Загрузка изображений</h2>
<form method="post" enctype="multipart/form-data" action="">
<input type="file" name="fupload" />
<input type="submit" value="Загрузить" />
</form>
<?
foreach($images as $image)
{
echo '<a href = "img_big/' . $image . '" target ="_blank"><img src = "img_small/' . $image . '"/></a>';
}
?>
</body></html>
strpos($size['mime'], '/') возвращает позицию вхождения слеша, +1 дает позицию символа сразу после слеша, чтобы substr вернул всё что после него.
Например, в случае с image/gif без +1 конструкция strtolower(substr($size['mime'], strpos($size['mime'], '/'))) вернет /gif.
А вообще, дальше видно зачем это делается.
$icfunc = 'imagecreatefrom'.$format;
if (!function_exists($icfunc)) {
return false;
}
Для проверки существования функции создания изображения данного формата.
Почти разобрался, как работает этот скрипт, единственное не могу понять как работает эта часть кода
$x_ratio = $width / $size[0];
Загрузил я картинку размером 604 х 391, в $width ширина 250см, в $size[0] ширина 604см.
Зачем делить ширину уменьшенного изображения на ширину исходника? Что это дает? Или я что то не так понял?
Почти разобрался, как работает этот скрипт, единственное не могу понять как работает эта часть кода
$x_ratio = $width / $size[0];
Загрузил я картинку размером 604 х 391, в $width ширина 250см, в $size[0] ширина 604см.
Зачем делить ширину уменьшенного изображения на ширину исходника? Что это дает? Или я что то не так понял?
МБ коэффициент уменьшения находят?
Потом можно вычислить высоту картинки (хотя, зачем?)
Sent from my Boost IIse using Tapatalk
МБ коэффициент уменьшения находят?
Потом можно вычислить высоту картинки (хотя, зачем?)
Sent from my Boost IIse using Tapatalk
Нашел в инете, что эти строчки кода отвечают за пропорцию картинки, больше ни какой информация нет! Как работает данный кусок кода ни кто не описывает.
$x_ratio = $width / $size[0]; здесь ширина миниатюры 250 в $size[0] 641
$y_ratio = $height / $size[1]; здесь высота миниатюры 250 в $size[1] 391
Если написать var_dump($x_ratio, $y_ratio) , то на экране можно увидеть результат деления float(0.41390728476821) float(0.63938618925831) , этот результат дает пропорции картинке, только не могу понять как это работает. 😕
$size = getimagesize($src);
// тут по идее при ошибке должно возвращаться или null или false, в разных мануалах по разному, но проверка идет через булево... вообщем если что-то не так - прерываем работу
if ($size === false) {
return false;
}
// получаем тип изображения
$format = strtolower(substr($size['mime'], strpos($size['mime'], '/') + 1));
// если недоступна функция обработки изображения данного типа - выходим
$icfunc = 'imagecreatefrom'.$format;
if (!function_exists($icfunc)) {
return false;
}
// Коэффициент изменения ширины изображения
$x_ratio = $width / $size[0];
// коэффициент изменения высоты изображения
$y_ratio = $height / $size[1];
// если высота не передана - изменяем по ширине
if ($height == 0) {
$y_ratio = $x_ratio;
$height = $y_ratio * $size[1];
// если ширина не передана - изменяем по высоте
} elseif ($width == 0) {
$x_ratio = $y_ratio;
$width = $x_ratio * $size[0];
}
// получаем минимальный коэффициент
$ratio = min($x_ratio, $y_ratio);
// Проверяем, а не равен ли минимальный коэффициент коэффициенту изменения ширины
$use_x_ratio = ($x_ratio == $ratio);
// новая ширина - или переданная в функцию, или полученная через коэффициент
$new_width = $use_x_ratio ? $width : floor($size[0] * $ratio);
// аналогично для высоты
$new_height = !$use_x_ratio ? $height : floor($size[1] * $ratio);
// если новая ширина не изменилась, то отступов не делаем, иначе центруем новое изображение по горизонтали
$new_left = $use_x_ratio ? 0 : floor(($width - $new_width) / 2);
// аналогично по вертикали
$new_top = !$use_x_ratio ? 0 : floor(($height - $new_height) / 2);
// получаем изображение из файла, переданного в функцию
$isrc = $icfunc($src);
// создаем холст нового изображения
$idest = imagecreatetruecolor($width, $height);
// заливка фоном
imagefill($idest, 0, 0, $rgb);
// размещаем на холсте изображение, масштабируем, если надо - смещаем его
imagecopyresampled($idest, $isrc, $new_left, $new_top, 0, 0, $new_width, $new_height, $size[0], $size[1]);
// сохраняем новое изображение
imagejpeg($idest, $dest, $quality);
// чистим память от промежуточных картинок
imagedestroy($isrc);
imagedestroy($idest);
А вообще этот пример стандартно-типовой с одного из сайтов php-шного сообщества
---------- Добавлено 12.03.2016 в 01:38 ----------
Если написать var_dump($x_ratio, $y_ratio) , то на экране можно увидеть результат деления float(0.41390728476821) float(0.63938618925831) , этот результат дает пропорции картинке, только не могу понять как это работает.
На это число умножается размер в px исходной картинки, для того, чтобы картинка сохранила пропорции.
---------- Добавлено 12.03.2016 в 01:48 ----------
Ну и в догонку, чтобы автор понимал.
Стандартные функции изображений php - очень ресурсоемки, сильно тормозят и вообще прошлый век. При больших размерах изображений упереться в потолок оперативки на лимитированном хостинге - раз плюнуть, да и просто стандартную выделенную оперативку сожрать - без проблем.
Советую пользовать Imagick....
К примеру код ресайза (правда с некими допилами под свои костыли)
{
if (file_exists($source) && !file_exists($dest)) {
$image = new Imagick($source);
} else {
return false;
}
$bigSize = ($image->getImageWidth() > $image->getImageHeight()) ? true : false;
if($h == 0) {
if($bigSize) {
$image->thumbnailImage($w, 0);
} else {
$image->thumbnailImage(0, $w);
}
} else {
$image->cropThumbnailImage($w, $h);
}
$image->setImageFormat('jpeg');
$image->setImageCompression(imagick::COMPRESSION_JPEG);
$image->setImageCompressionQuality(75);
$image->stripImage();
return $image->writeImage($dest); // TRUE OR FALSE
}
Огромное спасибо за развернутый ответ!
Добрый день, Иван. Скажите вы нашли ответ по добавлению комментариев в DLE. У меня такая же проблема. Та тема уже закрыта. Пришлось написать сюда.