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

Форум 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$src00,?,0$w$h, ?,?); 
         }
         if (
$w_src<$h_src) {
         
imagecopyresized($dest$src0000$w$h,?, ?);
         }
     if (
$w_src==$h_src
     
imagecopyresized($dest$src0000$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)
 

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

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования