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

Статус
В этой теме нельзя размещать новые ответы.

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 - с получившимся превью
 
Уважаемый ТС а можно сделать сразу 2-е картинки (напр первая 100х100, вторая 250х250, и удалить большую заненадобностью) из одной большой используя ваш метод? Если не сложно - помогите!!!!
 
а есть какой-нибудь гайд по использованию встроенной функции в неткат?
 
jhhj

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

Сейчас стала такая задача по авторесайзу. Позже отпишусь.
 
А для NetCat 4 этот метод подойдет?:ah:
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху