Ресайз картинок в NetCat 2.4 - 3.2

Тема в разделе "NetCat", создана пользователем programmer87, 20 июн 2009.

Статус темы:
Закрыта.
  1. programmer87

    programmer87 Создатель

    Регистр.:
    8 фев 2007
    Сообщения:
    23
    Симпатии:
    10
    До сегодняшнего дня ресайз картинок в NetCat так и не реализовали по-человечески, разве что в редакции 3.5 имеется полурабочий класс nc_imagetransform.class.php который пришлось править чтоб он работал

    Выкладываю скрипты ресайза картинок, которые я в свое время писал под NetCat 2.4

    Инструкция

    В шаблон надо добавить поле типа "Файл", хранящее маленький рисунок, тип доступа поставить "Недоступно никому", имя поля согласовать с $thumbfield.
    В дефолтный модуль следует добавить функцию изменения размера изображения, код которой несолькими постами выше.
    При добавлении/изменении большой картинки в объекте, автоматом будет создаваться маленькая картинка. При удалении объекта, маленькая картинка удалится автоматически стандартными средствами NetCat.

    Далее в файл /netcat/modules/default/function.inc.php следует добавить нижеприведенную функцию imageResize

    Код:
    function imageResize($src, $dest, $width, $height)
    
    {
    
    	if (!file_exists($src)) return false;
    
    	$size = getimagesize($src);
    
    
    
    	if ($size === false) return false;
    
    
    
    	// Определяем исходный формат по MIME-информации, предоставленной
    
    	// функцией getimagesize, и выбираем соответствующую формату
    
    	// imagecreatefrom-функцию.
    
    	$format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
    
    	$icfunc = "imagecreatefrom" . $format;
    
    	$ifunc = "image" . $format;
    
    	if (!function_exists($icfunc)) return false;
    
    	if (!function_exists($ifunc)) 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($new_width, $new_height);
    
    	
    
    	imagecopyresampled($idest, $isrc, 0, 0, 0, 0,
    
    	$new_width, $new_height, $size[0], $size[1]);
    
    
    
    	$ifunc($idest, $dest);
    
    	
    
    	imagedestroy($isrc);
    
    	imagedestroy($idest);
    
    	
    
    	return true;
    
    
    
    }
    После этого в Действии после добавления объекта вставляете следующий код

    Код:
    ";
    
    $thwidth=100; // ширина превьюшки
    
    $thheight=100; // высота превьюшки
    
    $picfileID=85; // ид поля шаблона большой картинки
    
    $thumbfileID=84; // ид поля шаблона маленькой картинки
    
    $messtable='Message2'; // таблица шаблона (MessageXX где XX - ид шаблона)
    
    $thumbfield='Pic'; // название поля шаблона маленькой картинки
    
    $pict_path=$DOCUMENT_ROOT."/netcat_files/".$sub."/".$cc."/";
    
    $picfile=listQuery("SELECT Virt_Name, File_Path FROM Filetable WHERE Field_ID=".$picfileID." AND Message_ID=".$message,"/netcat_files\$data[File_Path]\$data[Virt_Name]");
    
    if($picfile!="")
    
    {
    
    // большой рисунок есть, создаем маленький
    
    $picfile=listQuery("SELECT Virt_Name FROM Filetable WHERE Field_ID=".$picfileID." AND Message_ID=".$message,"\$data[Virt_Name]");
    
    $temp_virt_name=md5($filename.date("H:i:s d.m.Y").uniqid("netcat"));
    
    if (imageResize($pict_path.$picfile,$pict_path.$temp_virt_name, $thwidth, $thheight) && file_exists($pict_path.$temp_virt_name))
    
    {
    
    	$temp_thumb_size=@filesize($pict_path.$temp_virt_name);
    
    	if ($temp_thumb_size==0)
    
    	{
    
    		echo "<br>Ошибка! Файл превью существует, но его размер 0 байт.";
    
    	}
    
    	else
    
    {
    
    $temp_thumb_MIME=getimagesize($pict_path.$temp_virt_name);
    
    $temp_thumb_realname=pathinfo(listQuery("SELECT Real_Name FROM Filetable WHERE Field_ID=".$picfileID." AND Message_ID=".$message, "\$data[Real_Name]"));
    
    $temp_thumb_realname2=basename($temp_thumb_realname['basename'],".".$temp_thumb_realname['extension']);
    
    
    listQuery("UPDATE ".$messtable." SET ".$thumbfield."='".$temp_thumb_realname2."_th.".$temp_thumb_realname['extension'].":".$temp_thumb_MIME['mime'].":".$temp_thumb_size."' WHERE Message_ID=".$message);
    
    listQuery("INSERT INTO `Filetable` (`Real_Name` , `Virt_Name` , `File_Path` , `File_Type` , `File_Size` , `Message_ID` , `Field_ID` ) VALUES ('".$temp_thumb_realname2."_th.".$temp_thumb_realname['extension']."','".$temp_virt_name."','/".$sub."/".$cc."/','".$temp_thumb_MIME['mime']."',".$temp_thumb_size.",".$message.",$thumbfileID)");
    
    }
    
    }
    
    }
    
    echo "Объект сохранен. 
    
    <a href=/netcat/?catalogue=$catalogue&sub=$sub&cc=$cc>Вернуться</a>
    В действии после редактирования объекта, необходимо использовать нижеприведенный код

    Код:
    ";
    
    $thwidth=250; // ширина превьюшки
    
    $thheight=180; // высота превьюшки
    
    $picfileID=722; // ид поля шаблона большой картинки
    
    $thumbfileID=757; // ид поля шаблона маленькой картинки
    
    $messtable='Message75'; // таблица шаблона (MessageXX где XX - ид шаблона)
    
    $thumbfield='Imagem'; // название поля шаблона маленькой картинки
    
    $DOCUMENT_ROOT='/home/axwell/data/www/undervud.axwell.ru';
    
    $pict_path=$DOCUMENT_ROOT."/netcat_files/".$sub."/".$cc."/";
    
    $picfile=listQuery("SELECT Virt_Name, File_Path FROM Filetable WHERE Field_ID=".$picfileID." AND Message_ID=".$message,"/netcat_files\$data[File_Path]\$data[Virt_Name]");
    
    $thumbfile=listQuery("SELECT Virt_Name, File_Path FROM Filetable WHERE Field_ID=".$thumbfileID." AND Message_ID=".$message,"/netcat_files\$data[File_Path]\$data[Virt_Name]");
    
    if ($picfile=="")
    
    {
    
    	// рисунок или удален или его нет, следует убрать маленькую превьюшку
    
    	listQuery("UPDATE ".$messtable." SET ".$thumbfield."='' WHERE Message_ID =".$message);
    
    	listQuery("DELETE FROM filetable WHERE File_Path = '/".$sub."/".$cc."/' AND Field_ID =".$thumbfileID." AND Message_ID=".$message);
    
    }
    
    else 
    
    {
    
    	// большой рисунок есть, создаем/пересаздаем маленький
    
    	$picfile=listQuery("SELECT Virt_Name FROM Filetable WHERE Field_ID=".$picfileID." AND Message_ID=".$message,"\$data[Virt_Name]");
    
    	$temp_virt_name=md5($filename.date("H:i:s d.m.Y").uniqid("netcat"));
    
    	if (imageResize($pict_path.$picfile,$pict_path.$temp_virt_name, $thwidth, $thheight) && file_exists($pict_path.$temp_virt_name))
    
    	{
    
    		$temp_thumb_size=@filesize($pict_path.$temp_virt_name);
    
    		if ($temp_thumb_size==0)
    
    		{
    
    			echo "<br>Ошибка! Файл превью существует, но его размер 0 байт.";
    
    		}
    
    			else
    
    		{
    
    			$temp_thumb_MIME=getimagesize($pict_path.$temp_virt_name);
    
    			$temp_thumb_realname=pathinfo(listQuery("SELECT Real_Name FROM Filetable WHERE Field_ID=".$picfileID." AND Message_ID=".$message, "\$data[Real_Name]"));
    			
    			$temp_thumb_realname2=basename($temp_thumb_realname['basename'],".".$temp_thumb_realname['extension']);
    
    			listQuery("UPDATE ".$messtable." SET ".$thumbfield."='".$temp_thumb_realname2."_th.".$temp_thumb_realname['extension'].":".$temp_thumb_MIME['mime'].":".$temp_thumb_size."' WHERE Message_ID=".$message);
    
    			$thumb_file_id=listQuery("SELECT ID FROM Filetable WHERE File_Path = '/".$sub."/".$cc."/' AND Field_ID =".$thumbfileID." AND Message_ID=".$message,"\$data[ID]");
    
    			if ($thumb_file_id){
    
    				@unlink($pict_path.listQuery("SELECT Virt_Name FROM Filetable WHERE ID=".$thumb_file_id,"\$data[Virt_Name]"));
    
    				listQuery("UPDATE `Filetable` SET Real_Name='".$temp_thumb_realname2."_th.".$temp_thumb_realname['extension']."',Virt_Name='".$temp_virt_name."',File_Path='/".$sub."/".$cc."/', File_Type='".$temp_thumb_MIME['mime']."',File_Size=".$temp_thumb_size." WHERE ID=".$thumb_file_id);
    
    			} else {
    
    				listQuery("INSERT INTO `Filetable` (`Real_Name` , `Virt_Name` , `File_Path` , `File_Type` , `File_Size` , `Message_ID` , `Field_ID` ) VALUES ('".$temp_thumb_realname2."_th.".$temp_thumb_realname['extension']."','".$temp_virt_name."','/".$sub."/".$cc."/','".$temp_thumb_MIME['mime']."',".$temp_thumb_size.",".$message.",$thumbfileID)");
    
    			}
    
    		}
    
    	}
    
    }
    
    echo "Объект изменен. 
    
    <a href=/netcat/?catalogue=$catalogue&sub=$sub&cc=$cc>Вернуться</a>
    Добавлено через 4 минуты
    Для ресайза картинок в системе версий 3.2 - 3.5 можно применить следующую методику ресайза картинок.

    Для этих целей есть класс nc_ImageTransform, чтобы подключить этот класс
    надо подкючить файл require_once($nc_core->INCLUDE_FOLDER."classes/nc_imagetransform.class.php");
    в этом классе есть пара методов:

    • imgResize($src_img, $dest_img, $width, $height, $mode=0, $format='jpg', $quality=90)
    , где$src_img Путь к исходному изображению
    $dest_img Путь к создаваемому изображению
    $width Ширина нового изображения
    $height Высота нового изображения
    $mode [optional] Режим уменьшения: 0 - пропорционально уменьшает; 1 - вписывает в указанные размеры, обрезая края
    $format [optional] Формат создаваемого изображения (jpg, gif, png)
    $quality [optional] Качество сжатия изображения (0-100) при $format=='jpg'
    В случае ошибки возвратит false иначе возвратит путь к созданному файлу



    • createThumb($src_field_name, $dest_field_name, $width, $height, $mode=0, $format='jpg', $quality=90)

    Функции для создания копий для полей типа файл,
    в действиях после добавления, после изменения, где

    $src_field_name - имя поля-источника
    $dest_field_name - имя поля-приёмника
    $width Ширина нового изображения
    $height Высота нового изображения
    $mode [optional] Режим уменьшения: 0 - пропорционально уменьшает; 1 - вписывает в указанные размеры, обрезая края
    $format [optional] Формат создаваемого изображения (jpg, gif, png)
    $quality [optional] Качество сжатия изображения (0-100) при $format=='jpg'

    true в случае удачи, false - в случае ошибки.




    пример в действии после добавления

    Код:
    Код:
    if ($_FILES[f_Picture][size]!=0 && $_FILES[f_Picture][type]!='')  {    eval(listQuery("SELECT CustomSettings FROM Sub_Class WHERE Sub_Class_ID='$cc'","\$data[CustomSettings]"));    global $nc_core;    require_once($nc_core->INCLUDE_FOLDER."classes/nc_imagetransform.class.php");    nc_ImageTransform::createThumb('Picture','Preview',ширина,высота]);    $photo_path = $DOCUMENT_ROOT.nc_file_path($classID, $message, 'Picture', "");    if ($photo_path) nc_ImageTransform::imgResize($photo_path,$photo_path,ширина,высота);}
    поле Picture - с исходной картинкой
    поле Preview - с получившимся превью
     
    andrewww, stasdre, FoxMALDER и 4 другим нравится это.
  2. Alex666

    Alex666 Постоялец

    Регистр.:
    5 сен 2006
    Сообщения:
    56
    Симпатии:
    0
    Уважаемый ТС а можно сделать сразу 2-е картинки (напр первая 100х100, вторая 250х250, и удалить большую заненадобностью) из одной большой используя ваш метод? Если не сложно - помогите!!!!
     
  3. InoffLine

    InoffLine

    Регистр.:
    18 апр 2007
    Сообщения:
    573
    Симпатии:
    155
    а есть какой-нибудь гайд по использованию встроенной функции в неткат?
     
  4. FoxMALDER

    FoxMALDER Постоялец

    Регистр.:
    20 дек 2006
    Сообщения:
    85
    Симпатии:
    13
    jhhj

    То что полукласс, так это уже большой прорыв. :)

    Сейчас стала такая задача по авторесайзу. Позже отпишусь.
     
  5. CoDe_reD

    CoDe_reD Писатель

    Регистр.:
    13 май 2007
    Сообщения:
    3
    Симпатии:
    0
    А для NetCat 4 этот метод подойдет?:ah:
     
Статус темы:
Закрыта.