Помогите расшифровать код php

12
ИН
На сайте с 03.10.2013
Offline
150
1220

Речь о скрипте простой фото галереи. Делал по видео уроку, в котором автор объяснил как работает весь код, кроме функции img_resize, пришлось недостающую функцию взять с интернета. В итоге код полностью рабочий, но как работает эта функция мне не до конца понятно.

Два дня уже мучаюсь, с расшифровкой вот этой строки

$format = strtolower(substr($size['mime'], strpos($size['mime'], '/') + 1));

Помогите разобраться что означает '/' и +1?

AS
На сайте с 07.11.2014
Offline
24
#1
Иван НСК:
Речь о скрипте простой фото галереи. Делал по видео уроку, в котором автор объяснил как работает весь код, кроме функции img_resize, пришлось недостающую функцию взять с интернета. В итоге код полностью рабочий, но как работает эта функция мне не до конца понятно.

Два дня уже мучаюсь, с расшифровкой вот этой строки
$format = strtolower(substr($size['mime'], strpos($size['mime'], '/') + 1));

Помогите разобраться что означает '/' и +1?

Я так понимаю, в $size['mime'] хранится формат данных (например для gif он может быть таким: image/gif). Вся эта конструкция возвращает всё, что после слеша, опять же в случае с image/gif это будет gif.

L
На сайте с 30.10.2015
Offline
34
#2

Иван НСК, поиск вхождения с /

...
ИН
На сайте с 03.10.2013
Offline
150
#3
ai_sn:
Я так понимаю, в $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>
AS
На сайте с 07.11.2014
Offline
24
#4

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;

}

Для проверки существования функции создания изображения данного формата.

ИН
На сайте с 03.10.2013
Offline
150
#5

Почти разобрался, как работает этот скрипт, единственное не могу понять как работает эта часть кода

$x_ratio = $width / $size[0];

Загрузил я картинку размером 604 х 391, в $width ширина 250см, в $size[0] ширина 604см.

Зачем делить ширину уменьшенного изображения на ширину исходника? Что это дает? Или я что то не так понял?

A
На сайте с 10.12.2013
Offline
50
#6
Иван НСК:
Почти разобрался, как работает этот скрипт, единственное не могу понять как работает эта часть кода

$x_ratio = $width / $size[0];

Загрузил я картинку размером 604 х 391, в $width ширина 250см, в $size[0] ширина 604см.
Зачем делить ширину уменьшенного изображения на ширину исходника? Что это дает? Или я что то не так понял?

МБ коэффициент уменьшения находят?

Потом можно вычислить высоту картинки (хотя, зачем?)

Sent from my Boost IIse using Tapatalk

ИН
На сайте с 03.10.2013
Offline
150
#7
Artmik:
МБ коэффициент уменьшения находят?
Потом можно вычислить высоту картинки (хотя, зачем?)

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) , этот результат дает пропорции картинке, только не могу понять как это работает. 😕

VHS
На сайте с 28.09.2007
Offline
142
VHS
#8
// получаем размер и тип изображения
$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....

К примеру код ресайза (правда с некими допилами под свои костыли)

public function thumb($source, $dest, $w, $h = 0)
{

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

}
ИН
На сайте с 03.10.2013
Offline
150
#9

Огромное спасибо за развернутый ответ!

AN
На сайте с 12.03.2016
Offline
0
#10

Добрый день, Иван. Скажите вы нашли ответ по добавлению комментариев в DLE. У меня такая же проблема. Та тема уже закрыта. Пришлось написать сюда.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий