|
|
|
| Хотел спросить. Необходимо уменьшить размер изображения таким образом, что-бы:
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 и длинну исходного изображения которую нужно копировать в пустое ?
Кто в курсе ? | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: mastergrom
(30.05.2008 в 00:57)
| | width / height : меньше 0 - портрет, равно 0 - квадрат, больше 0 - альбом. Отсюда знаем по какой из сторон уменьшить. | |
|
|
|
|
|
|
|
для: sim5
(30.05.2008 в 06:37)
| | >width / height : меньше 0 - портрет, равно 0 - квадрат, больше 0 - альбом. Отсюда знаем по какой из сторон уменьшить.
О_о ??? Может 1? =)) | |
|
|
|
|
|
|
|
для: ddhvvn
(30.05.2008 в 09:27)
| | Ну да:
600 / 800 = 0.75 (< 0 портрет) (тут, ну скопировал автоматом)))
800 / 800 = 1 (стороны равны)
800 / 600 = 1,3 > 1
PS. Надо прекращать, смотреть одно (у меня видео связь с Москвой была)) , читать другое, и писать третье... с дури чего тока не напишешь.)) | |
|
|
|
|
|
|
|
для: 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);
|
| |
|
|
|
|
|
|
|
для: Foxel
(30.05.2008 в 08:46)
| | А вообще же, все это не пойдет, получется, что обрезка "вслепую" будет. Автору - может воспользоваться одним их этого:
DHTML
Обрезка с возможностью указанных пропорций
Еще обрезка
На стороне клиента, на выбранном для загрузки изображении выбираем регион и его координаты передаем на сервер вместе с загружаемым изображением. Если изображение большое по размеру, то у клиента выводить его с уменьшением (в процентах), а расчет координатов региона (JS) производить с учетом этого масштаба. Т.е. нужно будет написать свой небольшой JS сценарий к одному из вышепредложенных скриптов. | |
|
|
|
|
|
|
|
для: 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) - сторона которая обрезается..
но как правильно расчитать обрезку сторон и координаты? | |
|
|
|
|
|
|
|
для: mastergrom
(30.05.2008 в 15:04)
| | Выше уже готовое. Но вот как вы будете контролировать обрезку "вслепую"? Я еще понимаю, что при уменьшении изображения у вас придется обрезать по одной из сторон 10, ну ладно 30 рх. А если это портрет? Ведь вслепую вы можете обрезать все до глаз и ниже бороды, и у вас останется нос с ушами.)) Я вот о чем. Как в случае, когда остаток больший 100, будет достигать не малую величину, как вы будете принимать решение - где начинать вырезку? | |
|
|
|
|
|
|
|
для: sim5
(30.05.2008 в 15:26)
| | Это не важно ... Ты можешь подсказать как расчитывать все ? | |
|
|
|
|
|
|
|
для: mastergrom
(31.05.2008 в 13:51)
| | Вам Foxel написал код, и если не важно что в результате получать, берите его. В этом случае у вас регион для вырезки будет центрироваться по большей стороне изображения. Что вам не подходит? | |
|
|
|
|
|
|
|
для: 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);// по два пиксела обязательных полей
|
| |
|
|
|
|
|
|
|
для: Foxel
(01.06.2008 в 11:11)
| | Так, если изображение будет, ну пусть даже в два раза по высоте, например, больше ширины, то никак не получиться взять нужный кусочек "вслепую". Придется все таки уши выбирать.) Ну автора вроде это не волнует. | |
|
|
|
|