Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: imagecopyresized
 
 автор: mastergrom   (30.05.2008 в 00:20)   письмо автору
 
 

Хотел спросить. Необходимо уменьшить размер изображения таким образом, что-бы:
1)если изображение вертикальное то вырезалась середина по Y,
2)если изображение горизонтальное то вырезалась середина по X

ну и что-б оно масштабировалось до размеров:
$width=150;
$height=100;
на данный момент есть такой код:

<?php
function crop_image ($file) {
          // создаем исходное изображение и определяем его размеры
     $src = imagecreatefromjpeg($file); 
     $w_src = imagesx($src); 
     $h_src = imagesy($src);
         // определяем новые размеры 
         $w = 150;
         $h=100; 
         $needle="\\1_s.\\2";
         // создаем пустое изображение 
         $dest = imagecreatetruecolor($w,$h);
         // если ширина больше высоты
         if ($w_src>$h_src) {
         imagecopyresized($dest, $src, 0, 0,?,0, $w, $h, ?,?); 
         }
         if ($w_src<$h_src) {
         imagecopyresized($dest, $src, 0, 0, 0, 0, $w, $h,?, ?);
         }
     if ($w_src==$h_src) 
     imagecopyresized($dest, $src, 0, 0, 0, 0, $w, $w, $w_src, $w_src);
         $out_file = ereg_replace("(.*)\.(.*)",$needle,$file);
     return (imagejpeg($dest, "{$out_file}",80));         
                  

}


?>


Там где знаки вопроса - это я не могу понять как это расчитать?
Впринципе, ну что можно посчитать?
Ну, можно получить отношение меньшей стороны исходного изображения к большей как коэф.
А также отношение высоты исходного изображения к высоте конечного изображения ...
И как дальше ?
Как узнать позицию по X и длинну исходного изображения которую нужно копировать в пустое ?
Кто в курсе ?

   
 
 автор: alph[p]a   (30.05.2008 в 00:35)   письмо автору
 
   для: mastergrom   (30.05.2008 в 00:20)
 

что то вроде этого?

...
<?php
// узнаем размеры изображения
$image_p=getimagesize($file_upload_path.$_FILES['file']['name']);
// пропорция
$img_pr=round(($image_p['0']/$image_p['1']),2);
// максимально допустимая высота
$max_h='120';
// считаем ширину превьюшки
$max_w=$max_h*$img_pr;
// создаём превьюшку 
$image=imagecreatefromjpeg($file_upload_path.$_FILES['file']['name']);
$thumb=imagecreatetruecolor($max_w,$max_h);
imagecopyresampled($thumb,$image,0,0,0,0,$max_w,$max_h,$image_p['0'],$image_p['1']);
imagejpeg($thumb,$file_upload_path.'th/'.$_FILES['file']['name'],90);
?>
....

и еще есть поиск -http://softtime.ru/forum/srchform.php?id_forum=1

   
 
 автор: mastergrom   (30.05.2008 в 00:57)   письмо автору
 
   для: alph[p]a   (30.05.2008 в 00:35)
 

Та нет, совсем не то ...
Тут у тебя картинка уменьшается пропорционально относительно высоты,
а мне нужно сделать
150х100, даже если картинка, скажем 200Х100 или 150х200
то есть мне нужно вырезать кусок..
А в поиске я не нашел..
То есть, нужно расчитать положение по X с которого начинать вырезать и длинну которую вырезать (что-б она пропорционально уменьшилась и влезла в мои 150) если резать картинку у которой высота меньше ширины...

Народ, кто подскажет как высчитать?
int ImageCopyResized(int new_image, int old_image, int newX, int newY,
int oldX, int oldY, int newW, int newH, int oldW, int oldH)
интересует int oldX, int newW, int oldW

   
 
 автор: sim5   (30.05.2008 в 06:37)   письмо автору
 
   для: mastergrom   (30.05.2008 в 00:57)
 

width / height : меньше 0 - портрет, равно 0 - квадрат, больше 0 - альбом. Отсюда знаем по какой из сторон уменьшить.

   
 
 автор: ddhvvn   (30.05.2008 в 09:27)   письмо автору
 
   для: sim5   (30.05.2008 в 06:37)
 

>width / height : меньше 0 - портрет, равно 0 - квадрат, больше 0 - альбом. Отсюда знаем по какой из сторон уменьшить.
О_о ??? Может 1? =))

   
 
 автор: sim5   (30.05.2008 в 09:41)   письмо автору
 
   для: ddhvvn   (30.05.2008 в 09:27)
 

Ну да:
600 / 800 = 0.75 (< 0 портрет) (тут, ну скопировал автоматом)))
800 / 800 = 1 (стороны равны)
800 / 600 = 1,3 > 1

PS. Надо прекращать, смотреть одно (у меня видео связь с Москвой была)) , читать другое, и писать третье... с дури чего тока не напишешь.))

   
 
 автор: Foxel   (30.05.2008 в 08:46)   письмо автору
 
   для: mastergrom   (30.05.2008 в 00:57)
 


// $img - входное
$sx = imagesx($img);
$sy = imagesy($img);

// $nimg - выходное
$nimg  = imagecreatetruecolor(150, 100);

$scl = min($sx/150, $sy/100);
$cutw = $scl*150;
$cuth = $scl*100;
$cutx = ($sx - $cutw)/2;
$cuty = ($sy - $cuth)/2;

imagecopyresampled($nimg, $img, 0, 0, $cutx, $cuty, 150, 100, $cutw, $cuth);

   
 
 автор: sim5   (30.05.2008 в 09:25)   письмо автору
 
   для: Foxel   (30.05.2008 в 08:46)
 

А вообще же, все это не пойдет, получется, что обрезка "вслепую" будет. Автору - может воспользоваться одним их этого:
DHTML
Обрезка с возможностью указанных пропорций
Еще обрезка
На стороне клиента, на выбранном для загрузки изображении выбираем регион и его координаты передаем на сервер вместе с загружаемым изображением. Если изображение большое по размеру, то у клиента выводить его с уменьшением (в процентах), а расчет координатов региона (JS) производить с учетом этого масштаба. Т.е. нужно будет написать свой небольшой JS сценарий к одному из вышепредложенных скриптов.

   
 
 автор: mastergrom   (30.05.2008 в 15:04)   письмо автору
 
   для: sim5   (30.05.2008 в 09:25)
 

Спасибо, но это мне не подходит ...
Вобще, я так понимаю, что для того что-бы сделать тумбу $width=150 $height=100 с исходного изображения с $WIDTH и $HEIGHT у которого $WIDTH>$HEIGHT нужно:
1) $k=$height/$width
2) отношение меньшей стороны к большей у исходного изображения $K=$HEIGHT/$WIDTH

если $K>$k то оставлять max($WIDTH,$HEIGHT) как сторону которая вписывается полностью, а min($WIDTH, $HEIGHT), которая обрезается

если же $K<=$k то оставлять min($WIDTH, $HEIGHT) как строну которая полностью вписывается и max($WIDTH, $HEIGHT) - сторона которая обрезается..


но как правильно расчитать обрезку сторон и координаты?

   
 
 автор: sim5   (30.05.2008 в 15:26)   письмо автору
 
   для: mastergrom   (30.05.2008 в 15:04)
 

Выше уже готовое. Но вот как вы будете контролировать обрезку "вслепую"? Я еще понимаю, что при уменьшении изображения у вас придется обрезать по одной из сторон 10, ну ладно 30 рх. А если это портрет? Ведь вслепую вы можете обрезать все до глаз и ниже бороды, и у вас останется нос с ушами.)) Я вот о чем. Как в случае, когда остаток больший 100, будет достигать не малую величину, как вы будете принимать решение - где начинать вырезку?

   
 
 автор: mastergrom   (31.05.2008 в 13:51)   письмо автору
 
   для: sim5   (30.05.2008 в 15:26)
 

Это не важно ... Ты можешь подсказать как расчитывать все ?

   
 
 автор: sim5   (31.05.2008 в 14:22)   письмо автору
 
   для: mastergrom   (31.05.2008 в 13:51)
 

Вам Foxel написал код, и если не важно что в результате получать, берите его. В этом случае у вас регион для вырезки будет центрироваться по большей стороне изображения. Что вам не подходит?

   
 
 автор: Foxel   (01.06.2008 в 11:11)   письмо автору
 
   для: sim5   (30.05.2008 в 15:26)
 

Чтобы не срезать бороду ))) и вписать без нарущения пропорций в тумбу 150*100 лучше сделать тумбу с полями.

// $img - входное 
$sx = imagesx($img);
$sy = imagesy($img);

// $nimg - выходное
$nimg  = imagecreatetruecolor(150, 100);
imagefilledrectangle($nimg, 0, 0, 149, 99, 0xFFFFFF); // белый фон

$scl = min(150/$sx, 100/$sy);
$putw = $scl*$sx;
$puth = $scl*$sy;
$putx = (150 - $putw)/2;
$puty = (100 - $puth)/2;

imagecopyresampled($nimg, $img, $putx, $puty, 0, 0, $putw, $puth, $sx, $sy); 


ну для красоты можно махонькие поля добавить и по вписываемой стороне... (заменить расчет $scl)
$scl = min(146/$sx, 96/$sy);// по два пиксела обязательных полей

   
 
 автор: sim5   (01.06.2008 в 11:25)   письмо автору
 
   для: Foxel   (01.06.2008 в 11:11)
 

Так, если изображение будет, ну пусть даже в два раза по высоте, например, больше ширины, то никак не получиться взять нужный кусочек "вслепую". Придется все таки уши выбирать.) Ну автора вроде это не волнует.