styleroom
(Styleroom)
December 4, 2013, 12:47pm
1
народ, нужен логический хелп!
загружаю картинки с предварительной обрезкой по стандартам из центра пикчи
все гут, до тех пор - пока оригинал не меньше чем выбран стандартный размер…
ессно - справа появляется черный фон
вопрос: что нужно сделать, чтобы сначала маленький оригинал растянуть до стандартного размера, а затем уже из него вырезать кусок?
два раза imagecopyresampled с промежуточным сохранением увеличенного файла в темпорари?
mihail_dev
(Mihail Cucer)
December 4, 2013, 2:28pm
2
styleroom:
народ, нужен логический хелп!
загружаю картинки с предварительной обрезкой по стандартам из центра пикчи
все гут, до тех пор - пока оригинал не меньше чем выбран стандартный размер…
ессно - справа появляется черный фон
вопрос: что нужно сделать, чтобы сначала маленький оригинал растянуть до стандартного размера, а затем уже из него вырезать кусок?
два раза 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();
}
дальше стандартные манипуляции
styleroom
(Styleroom)
December 5, 2013, 5:34am
3
вобщем-то да… мне тоже понравилось
вот только когда я попытался сделать так =
$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);
}
mihail_dev
(Mihail Cucer)
December 5, 2013, 9:46am
4
всё верно 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);
}
styleroom
(Styleroom)
December 5, 2013, 9:49am
5
всё верно 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);
}
спасибо за подсказки!
но в конкретном проекте решил остановиться на своем лисапете
mihail_dev
(Mihail Cucer)
December 5, 2013, 10:04am
6
свой лисапет всё же ближе!!! так всегда! ))
styleroom
(Styleroom)
December 5, 2013, 10:10am
7
ну так! лелеял его… десятки раз переделывал… грезил его совершенством…
styleroom
(Styleroom)
December 5, 2013, 11:57am
8
есть спецы по htaccess?
нужно чтобы файл site1.ru/style.css заменялся на site2.ru/style.css
такое возможно?
ineersa
(Ineersa)
December 5, 2013, 1:02pm
9
А почему не подключить на site.ru файл site2.ru/style.css ?
styleroom
(Styleroom)
December 6, 2013, 6:46am
10
не хочется чтобы в коде был виден путь к site2.ru
p.s. легко конечно мягкую ссылку сделать, но вдруг можно обойтись и htaccess
ineersa
(Ineersa)
December 6, 2013, 8:43am
11
Я не знаю такого метода. Есть вариант - сделать символические ссылки css файлов на site2 на сайте site1.
На шаред хостинге невозможно, ну или почти. Нужен root либо пользователь с нормальным доступом. Подрывает безопасность сервера очень сильно.
Я делал похожую систему недавно, у меня было ядро и порядка 15 платформ работающих на этом ядре. Все получилось адекватно вынести в ядро, css линковал, можете попробовать через
'components'=>array(
'assetManager'=>array(
'basePath'=>'<new assets folder path>',
),
и публиковать все. При этом задать алиас ядра например.
styleroom
(Styleroom)
December 6, 2013, 8:53am
12
ineersa:
Я не знаю такого метода. Есть вариант - сделать символические ссылки css файлов на site2 на сайте site1.
На шаред хостинге невозможно, ну или почти. Нужен root либо пользователь с нормальным доступом. Подрывает безопасность сервера очень сильно.
Я делал похожую систему недавно, у меня было ядро и порядка 15 платформ работающих на этом ядре. Все получилось адекватно вынести в ядро, css линковал, можете попробовать через
'components'=>array(
'assetManager'=>array(
'basePath'=>'<new assets folder path>',
),
и публиковать все. При этом задать алиас ядра например.
да-да, это я слегка в курсе! сам так реализовал текущий проект
p.s. видать придется сделать мягкие ссылки