![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Jun 2005
Адрес: Н.Новгород
Сообщений: 107
|
Вот делаю галерею, начал делать превиюшки(уменьшенные исходные изображения), которые формируются при upload-e на сервер
примерно так: <? $img = ImageCreateFromJpeg($_GET{'image'}); $resize = (100*imagesy($img))/Imagesx($img);//здесь 100 это ширина сжатого изображения $img_small = ImageCreate(100, $resize); ImageCopyResized($img_small, $img, 0, 0, 0, 0, 100, $resize, Imagesx($img), imagesy($img)); ImageJpeg($img_small), 'small_'.$_GET{'image'}.'.jpg"); ?> Но при этом картинка полностью теряет свои изначальные цвета. PHP Version 4.3.9 все остальное на приаттаченном файле. Вот и вопрос: можно как нибудь сжать изображения средствами PHP без потери цвета. |
|
|||||
|
Ветеран форума
|
imagecreatetruecolor + imagecopyresampled
|
|
|||||
|
Регистрация: Jun 2000
Адрес: $_SERVER['REMOTE_ADDR']
Сообщений: 854
|
Писал тут функцию для загрузки джпегов для фотогалереи, на выходе вполне приличные результаты получил...
Приму советы по улучшению ![]() <?php
// Используемые константы
define("UPLOAD", "E:\\InetPub\\...\\photos\\"); // Винды!!!
define("PHOTOPATH", "../photos/");
// Функция
function uploadphoto ($maxthumbsize,$maxlargesize,$name,$path,$field) {
$result=array();
if ($_FILES[$field]['error']==0) {
$types=array("image/pjpeg", "image/jpeg");
if (in_array($_FILES[$field]['type'],$types)) {
$tmpname="tmp_".md5(date("U")).".jpg";
$relpath=($path=="") ? PHOTOPATH : PHOTOPATH.$path."/";
$locpath=($path=="") ? UPLOAD : UPLOAD.$path."\\"; // Винды!!!
if (move_uploaded_file($_FILES[$field]['tmp_name'], $locpath.$tmpname)) {
$message="Файл успешно загружен на сервер.";
list($width,$height,$type,$attr) = getimagesize($relpath.$tmpname);
$quality=70; // Качество
$source=imagecreatefromjpeg($relpath.$tmpname);
if ($maxthumbsize>0) {
$ratiothumb=($height/$width > 1) ? $height/$maxthumbsize : $width/$maxthumbsize;
$thumbwidth=intval($width/$ratiothumb);
$thumbheight=intval($height/$ratiothumb);
$thumb=imagecreatetruecolor($thumbwidth,$thumbheight);
imagecopyresampled($thumb,$source,0,0,0,0,$thumbwidth,$thumbheight,$width,$height);
imagejpeg($thumb,$relpath."thumb_".$name.".jpg",$quality);
imagedestroy($thumb);
$message.="\nСоздано изображение с именем thumb_".$name.".jpg";
}
if ($maxlargesize>0) {
$ratiolarge=($height/$width > 1) ? $height/$maxlargesize : $width/$maxlargesize;
if ($height<$maxlargesize&&$width<$maxlargesize) $ratiolarge=1;
$largewidth=intval($width/$ratiolarge);
$largeheight=intval($height/$ratiolarge);
$large=imagecreatetruecolor($largewidth,$largeheight);
imagecopyresampled($large,$source,0,0,0,0,$largewidth,$largeheight,$width,$height);
imagejpeg($large,$relpath."large_".$name.".jpg",$quality);
imagedestroy($large);
$message.="\nСоздано изображение с именем large_".$name.".jpg";
}
imagedestroy($source);
@unlink($relpath.$tmpname);
$result[0]=0;
$result[1]=$message;
$result[2]="thumb_".$name.".jpg";
$result[3]="large_".$name.".jpg";
return $result;
} else {
$result[0]=6;
$result[1]="Ошибка при копировании файла, возможно, отсутствует разрешение на запись в ".$locpath;
$result[2]="";
$result[3]="";
return $result;
}
} else {
$result[0]=5;
$result[1]="Неверный тип файла (".$_FILES[$field]['type'].")";
$result[2]="";
$result[3]="";
return $result;
}
} else {
$errorcode=$_FILES[$field]['error'];
$result[0]=$errorcode;
$filerrors=array ( "", "Размер файла превышает допустимый (php.ini)", "Размер файла превышает допустимый (form)", "Файл загружен частично", "Файл не выбран" );
$result[1]=$filerrors[$errorcode];
$result[2]="";
$result[3]="";
return $result;
}
}
// Вызов
$some_array=uploadphoto($maxthumbsize,$maxlargesize,$name,$path,$field);
// (размер превьюшки (большей стороны) или 0, размер полной фотки (большей строны) или 0, новое имя файла (добавляется префикс), путь относительно констант или "", имя поля из которого происходит загрузка файла)
// Возвращает: (код ошибки, текст ошибки, имя файла превьюшки, имя файла полной фотки)
?>
__________________
X Последний раз редактировалось Constantine; 08.07.2005 в 12:17. |
|
|||||
|
Регистрация: Jun 2005
Адрес: Н.Новгород
Сообщений: 107
|
Просто заменил ImageCreate на imagecreatetruecolor и ImageCopyResized на imagecopyresampled(спасибо разработчикам PHP)
Большое спасибо. --- P.S.Еще один вопрос опять о галерее У меня в галерее не только jpeg'и и поэтому приходиться определять тип файла(кстати почему-то exif_imagetype undefinded function пришлось использовать getimagesize) и потом в зависимости от того какой тип делать imagecreatefrom* нет ли функции которая сама определяла бы тип файла и из него создавала image? P.P.S. 2Constantine: Не мог бы ты обьяснить смысл строк типа этих $relpath=($path=="") ? PHOTOPATH : PHOTOPATH.$path."/"; $ratiothumb=($height/$width > 1) ? $height/$maxthumbsize : $width/$maxthumbsize; Я имею ввиду не в твоем скрипте, а в принципе переменная = (условие) ? значение1 : значение2 |
|
|||||
|
Регистрация: Jun 2000
Адрес: $_SERVER['REMOTE_ADDR']
Сообщений: 854
|
В глобальной $_FILES['field']['type'] как раз и содержится тип файла в зависимости от неё и ветви...
переменная=(если...) то "это" в обратном случает "другое"; Альтернативная запись оператора if ... else
__________________
X |
|
|||||
|
Регистрация: Jun 2005
Адрес: Н.Новгород
Сообщений: 107
|
Цитата:
Цитата:
Благодарю |
|
|||||
|
Ветеран форума
|
Цитата:
для определения типа надо использовать: http://php.net/getimagesize |
|
|||||
|
Регистрация: Jun 2000
Адрес: $_SERVER['REMOTE_ADDR']
Сообщений: 854
|
Цитата:
![]()
__________________
X |
![]() |
![]() |
Часовой пояс GMT +4, время: 17:18. |
|
|
« Предыдущая тема | Следующая тема » |
|
|