ммм. вот тебе пример класса для уменьшения картинок по большей стороне:
PHP:
class ImageClass{
var $name="";
var $ext="";
var $i_ext=array(
"jpeg"=>"JPEG",
"jpg"=>"JPEG",
"png"=>"PNG",
"gif"=>"GIF"
);
var $width="";
var $height="";
var $path="";
function ImageClass($width, $height, $image, $where='') {
$source = "";
if(strpos($image,$_SERVER['DOCUMENT_ROOT'])===false)
$image=$_SERVER['DOCUMENT_ROOT'].'/'.$image;
if(!is_file($image))
return false;
$ext_pos=strrpos($image,".");
$folder_pos=strrpos($image,"/");
$this->name=substr($image,$folder_pos+1,$ext_pos);
$this->ext=strtolower(substr($image,$ext_pos+1));
$_ext=$this->ext;
if(!array_key_exists($this->ext,$this->i_ext)){
return false;
} else {
$this->i_ext = array_flip($this->i_ext);
$func_ext=array_search($this->ext,$this->i_ext);
$func="ImageCreateFrom".$func_ext;
$source = @$func($image);
if(is_resource($source)===false)
foreach($this->i_ext as $k=>$v)
{
$func="ImageCreateFrom".$k;
$source = @$func($image);
if(is_resource($source)===true)
{
$this->ext=$v;
$func_ext=$k;
break;
}
}
$size[0] = ImageSX($source);
$size[1] = ImageSY($source);
$this->width = $size[0];
$this->height = $size[1];
$ft = $this->ext;
$quality = 75; /*качество полученной картинки от 0 до 100, можно вынести в параметры конструктора класса*/
$size = GetImageSize($image);
if($source != ""){
if(!($size[0]>$width)&&!($size[1]>$height))
return false;
$this->sourceResize($source,$width,$height);
$func="Image".$func_ext;
if($_ext!=$this->ext)
$image=str_replace(".".$_ext,".".$this->ext,$image);
if(!empty($where)&&!empty($this->name)&&!empty($this->ext)){
if(strpos($where,$_SERVER['DOCUMENT_ROOT'])!==false)
$where = str_replace($_SERVER['DOCUMENT_ROOT'],'',$where);
if(strpos($where,$_SERVER['HTTP_HOST'])===false)
$where='http://'.$_SERVER['HTTP_HOST'].'/'.$where;
//$where='https://'.$_SERVER['HTTP_HOST'].'/'.$where;
$image = $where.'/'.$this->name.'.'.$this->ext;
}
@$func($source, $image);
@ImageDestroy($source);
if(strpos($image,$_SERVER['DOCUMENT_ROOT'])!==false)
$image=str_replace($_SERVER['DOCUMENT_ROOT'],'',$image);
if(strpos($image,$_SERVER['HTTP_HOST'])===false)
$image='http://'.$_SERVER['HTTP_HOST'].'/'.$image;
//$image='https://'.$_SERVER['HTTP_HOST'].'/'.$image;
$this->path = $image;
}
}
}
function sourceResize( $source, $width, $height )
{
$swidth = $width;
$sheight = $height;
$size[0] = ImageSX($source);
$size[1] = ImageSY($source);
if(is_array($size)&&!empty($size[0])&&!empty($size[1])){
if($size[1]>$height){
$height = $height;
$width = round(($height/$size[1]) * $size[0]);
$size[1] = $height;
$size[0] = $width;
}
if($size[0]>$swidth){
$width = $swidth;
$height = round(($swidth/$size[0]) * $size[1]);
}
}
$thumb = ImageCreateTrueColor($width, $height);
$this->width = $width;
$this->height = $height;
ImageCopyResampled($thumb, $source, 0, 0, 0, 0, $width, $height, ImageSX($source), ImageSY($source));
return $thumb;
}
function getWidth()
{
return (!empty($this->width)) ? $this->width : 0;
}
function getHeight()
{
return (!empty($this->height)) ? $this->height : 0;
}
function getPath()
{
return (!empty($this->path)) ? $this->path : 0;
}
}
$image = 'путь к картинке на сервере';
$obj = new ImageClass(500,400,$image,'thumbs')
$width = $obj->getWidth();
$height = $obj->getHeight();
$path = $obj->getPath();
echo ('<img src="'.$path.'" width = "'.$width.'"' height="'.$height.'" />');
unset($obj, $image, $width, $height, $path);
Реально работающий класс задачей которого является:
а) уменьшение кратинок по длинне ширине - и складывание их "мелких копий" на сервере.
б) получение после уменьшения высоты и длинны вновь созданной картинки (чтобы указать в атрибутах тэга img при отдаче картинки браузеру
в) "складывание" уменьшенных картинок в указанную папку
Класс требует таких параметров:
длинна картинки,высота картинки, путь к картинке на сервере
(путь должен быть указан абсолютно, пример: /var/www/my_site/images/test.jpg), опционально - последний параметр - путь, куда складывать уменьшенный рисунок, задается без / на конце, так же предпочтительнее указывать абсолютный путь. При этом - если параметр не задан: картинка сохраняется под тем же именем в той же папке.
Работает с типами .gif, .png, .jpeg,.jpg - если картинка является другим типом файла с переименованным расширением - класс попытается "подобрать" правильный тип файла и сохранить картинку уже с верным расширением.
Методы класса:
getPath() - возвращает абсолютный путь к файлу картинки
Комментарии:
PHP:
if(strpos($image,$_SERVER['DOCUMENT_ROOT'])!==false)
$image=str_replace($_SERVER['DOCUMENT_ROOT'],'',$image);
if(strpos($image,$_SERVER['HTTP_HOST'])===false)
$image='http://'.$_SERVER['HTTP_HOST'].'/'.$image;
//$image='https://'.$_SERVER['HTTP_HOST'].'/'.$image;
после обработки изображения мы проверяем путь, где хранится наша преобразованная картинка на наличие абсолютного пути к папке, если он есть то удаляем его, и проверяем путь на указание адреса сайта - если его нет - то добавляем его.
getHeight() - возвращает высоту картинки после ресайза
getWidth() - возвращает ширину картинки после ресайза
Указан пример использования - задание пути высоты и длинны картинки в тэге img после ресайза
Класс рабочий. Единственное "с коленки" дописана часть функции складывания ресайза картинок в другие папки и попытки получения пути к картинке для использования в параметре src тэга img - но там ошибку было бы сложно допустить.
Что интересного еще можно для себя будет сделать с этим примером:
- выдача предупреждений в спорных ситуациях
- контроль уникальности имен файлов в папке при ресайзе картинок
- работа с относительными путями
Пользуйтесь.)
Требования: библиотека GD.
Внимание! Класс работает только с абсолютными путями к файлам, находящимся уже на Вашем сервере. С файлами с других севреров, или относительными путями работать не будет.