[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Самовольно меняется параметр внутри функции
Воитель
Я чуть с ума не сашёл. Есть функция

function img_resize($src, $dest, $width, $height, $srgbb = "DECS", $rgb = "0e0e10") {
//echo "cvet ".$srgbb.'<br />';
//echo "cvet ".$rgb.'<br />';


/***********************************************************************************

По завершению работы функция возвращает массив:
$otvetnoe_soobschenie[0] = true; //Статус выполнения
$otvetnoe_soobschenie[1] = "Файл успешно создан"; //Ошибки
$otvetnoe_soobschenie[2] = $quality; //Качество

Параметры:
$src - имя исходного файла
$dest - имя генерируемого файла
$width, $height - ширина и высота генерируемого изображения, в пикселях
Необязательный параметр:
$rgb - цвет фона, по умолчанию - белый
***********************************************************************************/

//$rgb="0aAAAAAA";

if (!file_exists($src)) return false;

$size = getimagesize($src);

if ($size === false) return false;

if ($width == 0) { //В этом условии мой код
$width = ($height * $size[0]) / $size[1];
$width = ceil($width);
}
if ($height == 0) { //В этом условии мой код
$height = ($width * $size[1]) / $size[0];
$height = ceil($height);
}


// Определяем исходный формат по MIME-информации, предоставленной
// функцией getimagesize, и выбираем соответствующую формату
// imagecreatefrom-функцию.

$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];

$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);



$cvet_v_desyatichnoy_1 = hexdec(substr($rgb, 0, 2)); //Возвращает цвет в формате от 0 до 255
$cvet_v_desyatichnoy_2 = hexdec(substr($rgb, 2, 2)); //Возвращает цвет в формате от 0 до 255
$cvet_v_desyatichnoy_3 = hexdec(substr($rgb, 4, 2)); //Возвращает цвет в формате от 0 до 255
//echo 'Cvet 1: '.$cvet_v_desyatichnoy_1.' Cvet 2: '.$cvet_v_desyatichnoy_2.' Cvet 3: '.$cvet_v_desyatichnoy_3.'<br />';

$rgb = imagecolorallocate($idest, $cvet_v_desyatichnoy_1, $cvet_v_desyatichnoy_2, $cvet_v_desyatichnoy_3);
//echo $rgb;
imagefill($idest, 0, 0, $rgb);
imagecopyresampled($idest, $isrc, $new_left, $new_top, 0, 0,$new_width, $new_height, $size[0], $size[1]);

imagedestroy($isrc);

$quality = 100; //Изначально устанавливается аксимальное качество
imagejpeg($idest, $dest, $quality);


$maksimalniy_razmer_iz = $this->maksimalniy_razmer_fayla_zalivki*1024*1024;
//echo $maksimalniy_razmer_iz.'<br>';
$razmer_poluchennogo_iz = filesize($dest); // Размер файла в байтах
//echo $razmer_poluchennogo_iz.'<br>';

$kolvo_umensheniy_kachestva = 0;

while ($razmer_poluchennogo_iz >= $maksimalniy_razmer_iz & $quality > 0) { //Качество ниже 60 лучше не использовать - изображение становиться размытым
$kolvo_umensheniy_kachestva ++;
unlink($dest); //Удаляем файл
//Снижаем качество, формула получена эксперементально, из расчёта 7 изменений качества на 1 картинку, представляет собой растянутую парабалу 100-(x^2)*2.

$quality = 100 - round($kolvo_umensheniy_kachestva*$kolvo_umensheniy_kachestva*2);
if ($quality < 0) { $quality = 0; }
//echo $quality;

imagejpeg($idest, $dest, $quality); //Создаём изображение с новым качеством
$razmer_poluchennogo_iz = filesize($dest); // Обновляем размер файла в байтах
}


$vozvraschemoe_znachenie_metoda = true;
$otvetnoe_soobschenie[0] = true; //Статус выполнения
$otvetnoe_soobschenie[1] = "Файл успешно создан"; //Ошибки
$otvetnoe_soobschenie[2] = $quality; //Качество

if ($razmer_poluchennogo_iz >= $maksimalniy_razmer_iz) { //Если снижение качества не помогло
$otvetnoe_soobschenie[0] = false;
$otvetnoe_soobschenie[1] = 'Erorr: Несмотря на уменьшение качества от 100 до 10, размер изображения в '.$razmer_poluchennogo_iz.' байт превышает максимальнодопустимое значение в '.$maksimalniy_razmer_iz.' байт.' ;
}


imagedestroy($idest);

return $otvetnoe_soobschenie;
} //Закрытие метода img_resize()


Саму функцию писал не я. Но я её доробатывал под какие-то свои нужды.
Функция может задавать фон изменяемой картинке, когда я эту функцию тестил после её приобретения вроде в ней работало изменение фона(а может я пробовал только чёрный и белый цвета)
Но когда на самом деле потребовалось изменить фон, он почему-то не заработал работал.

Стал ремонтировать, согласно какой-то документации на англ. впоял функцию
imagecolorallocate
и к ней ещё немного кода.
Но нужный цвет не получался. Потом обнаружил что пятый параметр функции может выдавать только значения 16777215 которое по сути выдаёт мне функция imagecolorallocate при белом цвете.
И на этом моменте я чуть с ума не сошёл. Входит одно значение, а внутри функции тут же другое. Вопрос я решил добавив 6 параметр.
Но почему меняется значение в функции - для меня это загадка недели или даже месяца )
Есть подозрения что это какая-то хрень из ооп на "И" вроде начинает(что бы не показаться невеждой 5 минут вспонимал, но так и не смог)



Спустя 2 минуты, 8 секунд (8.09.2011 - 01:01) Воитель написал(а):
Может эта переменная как-то граничена по объёму памяти?

Спустя 1 час, 11 минут, 24 секунды (8.09.2011 - 02:12) redreem написал(а):
заменил
$idest = imagecreatetruecolor($width, $height);


на
$idest = imagecreate($width, $height);


- работает без проблем - указаный фон делает как надо.
выкинул твою 6-ю переменную, а с $rgb проблемы и небыло, поскольку imagecolorallocate не цвет возвращает, а идентификатор цвета.

Спустя 22 минуты, 41 секунда (8.09.2011 - 02:35) Воитель написал(а):
Сейчас конечно попробую, но всё равно не допираю.
Я вывожу значение пятого параметра в самом смом начале:

//echo "cvet ".$srgbb.'<br />';
//echo "cvet ".$rgb.'<br />';


Кода ещё нет рабочего, а пятый параметр уже даёт значение 16777215

Спустя 5 минут, 48 секунд (8.09.2011 - 02:41) Воитель написал(а):
Функции я поменял, но от этого в картинке только цвета пропали.
Попробовал убрать шестой параметр, точнее пятый, а шестой стал пятым. И снова та же ерунда.

Может такая лажа как связана с тем что у меня это не функция а метод класса. Предположение групое, но подающее мне надежду в этом разобраться.

Спустя 5 часов, 11 минут, 19 секунд (8.09.2011 - 07:52) linker написал(а):
Покажи, как выглядит описание функции без шестого параметра и как ты вызываешь функцию (с какими параметрами).

Спустя 1 час, 10 минут, 12 секунд (8.09.2011 - 09:02) redreem написал(а):
у меня это работает.
<?php
function
img_resize($src, $dest, $width, $height,$rgb) {
//echo "cvet ".$srgbb.'<br />';
//echo "cvet ".$rgb.'<br />';


/***********************************************************************************

По завершению работы функция возвращает массив:
$otvetnoe_soobschenie[0] = true; //Статус выполнения
$otvetnoe_soobschenie[1] = "Файл успешно создан"; //Ошибки
$otvetnoe_soobschenie[2] = $quality; //Качество

Параметры:
$src - имя исходного файла
$dest - имя генерируемого файла
$width, $height - ширина и высота генерируемого изображения, в пикселях
Необязательный параметр:
$rgb - цвет фона, по умолчанию - белый
***********************************************************************************/

//$rgb="0aAAAAAA";

if (!file_exists($src)) return false;

$size = getimagesize($src);

if ($size === false) return false;

if ($width == 0) { //В этом условии мой код
$width = ($height * $size[0]) / $size[1];
$width = ceil($width);
}
if ($height == 0) { //В этом условии мой код
$height = ($width * $size[1]) / $size[0];
$height = ceil($height);
}


// Определяем исходный формат по MIME-информации, предоставленной
// функцией getimagesize, и выбираем соответствующую формату
// imagecreatefrom-функцию.

$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];

$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 = imagecreate($width, $height);

$cvet_v_desyatichnoy_1 = hexdec(substr($rgb, 0, 2)); //Возвращает цвет в формате от 0 до 255
$cvet_v_desyatichnoy_2 = hexdec(substr($rgb, 2, 2)); //Возвращает цвет в формате от 0 до 255
$cvet_v_desyatichnoy_3 = hexdec(substr($rgb, 4, 2)); //Возвращает цвет в формате от 0 до 255
//echo 'Cvet 1: '.$cvet_v_desyatichnoy_1.' Cvet 2: '.$cvet_v_desyatichnoy_2.' Cvet 3: '.$cvet_v_desyatichnoy_3.'<br />';
//echo $idest;

$rgb = imagecolorallocate($idest, $cvet_v_desyatichnoy_1, $cvet_v_desyatichnoy_2, $cvet_v_desyatichnoy_3);
//echo $rgb;
imagefill($idest, 0, 0, $rgb);
imagecopyresampled($idest, $isrc, $new_left, $new_top, 0, 0,$new_width, $new_height, $size[0], $size[1]);

imagedestroy($isrc);

$quality = 100; //Изначально устанавливается аксимальное качество
imagejpeg($idest, $dest, $quality);


$maksimalniy_razmer_iz = 1000*1024*1024;
//echo $maksimalniy_razmer_iz.'<br>';
$razmer_poluchennogo_iz = filesize($dest); // Размер файла в байтах
//echo $razmer_poluchennogo_iz.'<br>';

$kolvo_umensheniy_kachestva = 0;

while ($razmer_poluchennogo_iz >= $maksimalniy_razmer_iz & $quality > 0) { //Качество ниже 60 лучше не использовать - изображение становиться размытым
$kolvo_umensheniy_kachestva ++;
unlink($dest); //Удаляем файл
//Снижаем качество, формула получена эксперементально, из расчёта 7 изменений качества на 1 картинку, представляет собой растянутую парабалу 100-(x^2)*2.

$quality = 100 - round($kolvo_umensheniy_kachestva*$kolvo_umensheniy_kachestva*2);
if ($quality < 0) { $quality = 0; }
//echo $quality;

imagejpeg($idest, $dest, $quality); //Создаём изображение с новым качеством
$razmer_poluchennogo_iz = filesize($dest); // Обновляем размер файла в байтах
}


$vozvraschemoe_znachenie_metoda = true;
$otvetnoe_soobschenie[0] = true; //Статус выполнения
$otvetnoe_soobschenie[1] = "Файл успешно создан"; //Ошибки
$otvetnoe_soobschenie[2] = $quality; //Качество

if ($razmer_poluchennogo_iz >= $maksimalniy_razmer_iz) { //Если снижение качества не помогло
$otvetnoe_soobschenie[0] = false;
$otvetnoe_soobschenie[1] = 'Erorr: Несмотря на уменьшение качества от 100 до 10, размер изображения в '.$razmer_poluchennogo_iz.' байт превышает максимальнодопустимое значение в '.$maksimalniy_razmer_iz.' байт.' ;
}


imagedestroy($idest);

return $otvetnoe_soobschenie;
} //Закрытие метода img_resize()

$r=img_resize('map.jpg', 'map2.jpg', 500, 300, $rgb = "00ff00");
?>

Спустя 1 час, 54 минуты, 43 секунды (8.09.2011 - 10:57) Воитель написал(а):
Нашёл косяк ) ух, наконец-то.
Косяк был при вызове, у меня там ещё фабрика стоит.

А у меня были подозрения, что через интерфейсы можно задавать размер памяти для параметров. А материала подобного в инете не было.

Всем большое спасибо.


_____________
Вечно учусь.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.