Не По Yii

народ, нужен логический хелп!

загружаю картинки с предварительной обрезкой по стандартам из центра пикчи

все гут, до тех пор - пока оригинал не меньше чем выбран стандартный размер…

ессно - справа появляется черный фон

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

два раза imagecopyresampled с промежуточным сохранением увеличенного файла в темпорари?

во первых если маленькая картинка то возможно её вообще не над обрезать а только увеличить до необходимых размеров!?

но предварительно придётся определить какой размер у картинки и как её подготовить к основной обработке!

list($width, $height, $type, $attr) = getimagesize("img/image.jpg");

http://php.net/manual/ru/function.getimagesize.php

вообше мне нравится работать с обработчиком изображений во с этим приложением

http://www.yiiframework.com/extension/image

очень удобно

для примера

$image = new Image(‘images/test.jpg’);

if($image->width<300 && $image->height<300){

$image->resize(300, 300, Image::AUTO);

$image->save();

}

дальше стандартные манипуляции

вобщем-то да… мне тоже понравилось

вот только когда я попытался сделать так =


$image->crop(640, 480)->quality(100)->sharpen(5);

к картинке 500х500, то на выходе получил пикчу 500х480

а надо было бы ВСЕ РАВНО получить 640х480…

пришлось допилить свой "лисапет", который сделал все как надо =




public static function imgCropWork($obj,$dst_w,$folder='picts')

{

	$path = $obj->tempName;

	$src_info = getimagesize($path);

	$src_info_width = $src_info[0];

	$src_info_height = $src_info[1];

	$src_info_mime = $src_info['mime'];  


  switch ($src_info_mime) 

  {

	case 'image/jpeg':

	  $src_image = imagecreatefromjpeg($path);

	  break;      

	case 'image/gif':

	  $src_image = imagecreatefromgif($path);

	  break; 

	case 'image/png':

	  $src_image = imagecreatefrompng($path);

	  break;      

  } 


  $src_w = imagesx($src_image);

  $src_h = imagesy($src_image);

  $ratio_src = $src_w / $src_h; 


  $dst_h = ceil($dst_w / 4 * 3);

  $const_prop = $dst_w / $dst_h;


  $dst_image = imagecreatetruecolor($dst_w,$dst_h);

  $ratio_dst = $dst_w / $dst_h;


  $koef_w = $src_w / $dst_w;

  $koef_h = $src_h / $dst_h;


  if($ratio_src < 1) // есть исходник - портретный

  {

	$src_w_new = $src_w;

	$src_h_new = $src_w * $dst_h / $dst_w;

	$ratio_new = $src_w_new / $src_h_new;

	$from_left = 0;

	$from_top = ($src_h - $dst_h*$koef_w)/2;

  }

  elseif($ratio_src > 1) // исходник - ландшафтный ОБЫЧНЫЙ ЛАНДШАФТ

  {

	$src_w_new = $src_h * $ratio_dst;

	$src_h_new = $src_h;

	$ratio_new = $src_w_new / $src_h_new;

	if( $ratio_src > $const_prop ) // вытянутый ландшафт

	{

	  $from_left = ($src_w - $dst_w*$koef_h)/2;

	}

	elseif( $ratio_src < $const_prop ) // сжатый ландшафт

	{

	  $from_left = 0; // ОБЫЧНЫЙ ландшафт и этот параметр влияет на отступ в превью справа

	  $src_w_new = $src_info_width;

	  $src_h_new = $src_info_width * $dst_h / $dst_w;

	}

	else  // непонятный ландшафт

	{

	  $from_left = 0;

	}

	$from_top = 0;  

  }

  else // то есть исходник - квадратный

  {

	$src_w_new = $src_w;

	$src_h_new = $dst_h*$src_h/$dst_w;

	$ratio_new = $src_w_new / $src_h_new;

	$from_left = 0;

	$from_top = ($src_h - $dst_h*$koef_w)/2;  

  }

  

  imagecopyresampled($dst_image, $src_image, 0, 0, $from_left, $from_top, $dst_w, $dst_h, $src_w_new, $src_h_new);


  $image_prev =  "preview_" . self::nameRusToEngAddTime($obj->name);

  $image_orig = "original_" . self::nameRusToEngAddTime($obj->name);    


  $destination = $_SERVER['DOCUMENT_ROOT']."/$folder/";


  imagejpeg($dst_image, $destination . $image_prev, 100); // сохранили превьюшку на сервере

  move_uploaded_file($obj->tempName, $destination . $image_orig); // скопировали оригинал на сервер


  imagedestroy($dst_image);

  imagedestroy($src_image);


  $base_url = Yii::app()->request->getHostInfo();


  $full_path_orig = $base_url . '/' . $folder . '/' . $image_orig;

  $full_path_prev = $base_url . '/' . $folder . '/' . $image_prev;  


  return array('preview'=>$full_path_prev,'original'=>$full_path_orig);


}



всё верно crop - обрезание то есть картинка 500х500 при обрезании 640х480 при вычислении обрезания было вычислено что у длины нечего обрезать поэтому и получилось 500х480

попробуй предварительно через ресайз прогнать только над учесть варианты следующие

квадрат 500*500 по длине

квадрат 800*800 по длине

пр 800*400 по щирине

пр 400*800 по длине

пр 640*480 по длине




$ratioImage = $image->width/$image->height;

$ratioNeed = 640/480;

if($ratioImage < $ratioNeed){

$image->resize(640, 480, Image::HEIGHT)->crop(640, 480)->quality(100)->sharpen(5);

}else{

$image->resize(640, 480, Image::WIDTH)->crop(640, 480)->quality(100)->sharpen(5);

}

спасибо за подсказки!

но в конкретном проекте решил остановиться на своем лисапете

свой лисапет всё же ближе!!! так всегда! ))

ну так! лелеял его… десятки раз переделывал… грезил его совершенством…

есть спецы по htaccess?

нужно чтобы файл site1.ru/style.css заменялся на site2.ru/style.css

такое возможно?

А почему не подключить на site.ru файл site2.ru/style.css?

не хочется чтобы в коде был виден путь к site2.ru

p.s. легко конечно мягкую ссылку сделать, но вдруг можно обойтись и htaccess

Я не знаю такого метода. Есть вариант - сделать символические ссылки css файлов на site2 на сайте site1.

На шаред хостинге невозможно, ну или почти. Нужен root либо пользователь с нормальным доступом. Подрывает безопасность сервера очень сильно.

Я делал похожую систему недавно, у меня было ядро и порядка 15 платформ работающих на этом ядре. Все получилось адекватно вынести в ядро, css линковал, можете попробовать через




'components'=>array(

      'assetManager'=>array(

                'basePath'=>'<new assets folder path>',

   ),



и публиковать все. При этом задать алиас ядра например.

да-да, это я слегка в курсе! сам так реализовал текущий проект

p.s. видать придется сделать мягкие ссылки