помогите со скриптом

12
MS
На сайте с 26.04.2008
Offline
59
596

Привет всем. вот я надыбал скриптик загрузки изображений и изменения размера. но в нем проблема того, что он обрезает картинку. т.е. если загрузить большую картинку, он гдето 80% обрезает. что тут надо изменить, что бы он просто изменял размер, без обрезания.

$path_to_90_directory3 = '../content/movies/screens3_mini/';//папка, куда будет загружаться начальная картинка и ее сжатая копия



if(preg_match('/[.](JPG)|(jpg)|(gif)|(GIF)|(png)|(PNG)$/',$_FILES['screen_3m']['name']))//проверка формата исходного изображения
{

$filename3 = $_FILES['screen_3m']['name'];
$source3 = $_FILES['screen_3m']['tmp_name'];
$target3 = $path_to_90_directory3 . $filename3;
move_uploaded_file($source3, $target3);//загрузка оригинала в папку $path_to_90_directory
}
if(preg_match('/[.](GIF)|(gif)$/', $filename3)) {
$im3 = imagecreatefromgif($path_to_90_directory3.$filename3) ; //если оригинал был в формате gif, то создаем изображение в этом же формате. Необходимо для последующего сжатия
}
if(preg_match('/[.](PNG)|(png)$/', $filename3)) {
$im3 = imagecreatefrompng($path_to_90_directory3.$filename3) ;//если оригинал был в формате png, то создаем изображение в этом же формате. Необходимо для последующего сжатия
}

if(preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/', $filename3)) {
$im3 = imagecreatefromjpeg($path_to_90_directory3.$filename3); //если оригинал был в формате jpg, то создаем изображение в этом же формате. Необходимо для последующего сжатия
}


$w3 = 180; // квадратная 90x90. Можно поставить и другой размер.
$h3 = 120; // квадратная 90x90. Можно поставить и другой размер.


$w_src3 = imagesx($im3); //вычисляем ширину
$h_src3 = imagesy($im3); //вычисляем высоту изображения

// создаём пустую квадратную картинку
// важно именно truecolor!, иначе будем иметь 8-битный результат
$dest3 = imagecreatetruecolor($w3,$h3);

// вырезаем квадратную серединку по x, если фото горизонтальное
if ($w_src3>$h_src3)
imagecopyresampled($dest3, $im3, 0, 0,
round((max($w_src3,$h_src3)-min($w_src3,$h_src3))/2),
0, $w3, $h3, min($w_src3,$h_src3), min($w_src3,$h_src3));

// вырезаем квадратную верхушку по y,
// если фото вертикальное (хотя можно тоже серединку)
if ($w_src3<$h_src3)
imagecopyresampled($dest3, $im3, 0, 0, 0, 0, $w3, $h3,
min($w_src3,$h_src3), min($w_src3,$h_src3));

// квадратная картинка масштабируется без вырезок
if ($w_src3==$h_src3)
imagecopyresampled($dest3, $im3, 0, 0, 0, 0, $w3, $h3, $w_src3, $w_src3);


$date1=time(); //вычисляем время в настоящий момент.
imagejpeg($dest3, $path_to_90_directory3.$date1.".jpg");//сохраняем изображение формата jpg в нужную папку, именем будет текущее время. Сделано, чтобы у аватаров не было одинаковых имен.

//почему именно jpg? Он занимает очень мало места + уничтожается анимирование gif изображения, которое отвлекает пользователя. Не очень приятно читать его комментарий, когда краем глаза замечаешь какое-то движение.

$screen_m3 = $path_to_90_directory3.$date1.".jpg";//заносим в переменную путь до аватара.

$delfull3 = $path_to_90_directory3.$filename3;
unlink ($delfull3);
frantic
На сайте с 09.02.2009
Offline
27
#1

Я бы не рекомендовал использовать это. Поищите другой вариант

MS
На сайте с 26.04.2008
Offline
59
#2

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

frantic
На сайте с 09.02.2009
Offline
27
#3
Mac-style:
а может есть какой то просто из двух слов? мне надо просто что бы размер изменял и все.

что вообще без проверок? если файлы приходят от пользователя то надо проверять

MS
На сайте с 26.04.2008
Offline
59
#4

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

Mihajlo
На сайте с 30.10.2006
Offline
156
#5

гугл сломался?

JinzMan
На сайте с 26.02.2010
Offline
6
#6

Ну, изменение размера я, например, делал так:

      function resizeImage($image, $filename, $new_w, $new_h)

{
$src_img = imagecreatefromjpeg($image);

$old_x = imagesx($src_img);
$old_y = imagesy($src_img);

if ($old_x > $old_y)
{
$thumb_w = $new_w;
$thumb_h = $old_y * ($new_h / $old_x);
}
elseif ($old_x < $old_y)
{
$thumb_w = $old_x * ($new_w / $old_y);
$thumb_h = $new_h;
}
elseif ($old_x == $old_y)
{
$thumb_w = $new_w;
$thumb_h = $new_h;
}

$dst_img = imagecreatetruecolor($thumb_w, $thumb_h);
imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $thumb_w, $thumb_h, $old_x, $old_y);

imagejpeg($dst_img, $filename, 100);

imagedestroy($dst_img);
imagedestroy($src_img);
}
Веб разработка: скрипты, верстка, поддержка, создание сайтов, разработка веб-проектов (http://www.jinz.ru/) | Отзывы о работе со мной (/ru/forum/465577) Заказы принимаю на почту (mailto:jinzman@gmail.com) или в ICQ: 711472
MS
На сайте с 26.04.2008
Offline
59
#7

вот, методом тыка получилось у меня.

$w = 194;  // квадратная 90x90. Можно поставить и другой размер.

$h = 281; // квадратная 90x90. Можно поставить и другой размер.


$w_src = imagesx($im); //вычисляем ширину
$h_src = imagesy($im); //вычисляем высоту изображения

// создаём пустую квадратную картинку
// важно именно truecolor!, иначе будем иметь 8-битный результат
$dest = imagecreatetruecolor($w,$h);




imagecopyresampled($dest,$im,0,0,0,0,$w,$h,$w_src,$h_src);

но теперь проблемка, как сделать что бы он делал пропорционально? надо что бы по вертикали было фиксированное 281 а по горизонтали пропорционалилось.

гугл сломался?

да кстати чет был недоступен минуты 2. говорил опера что Невозможно найти удаленный сервер. Я обалдел...

JinzMan
На сайте с 26.02.2010
Offline
6
#8

Mac-style, см. мой пост.

MS
На сайте с 26.04.2008
Offline
59
#9
JinzMan:
Mac-style, см. мой пост.

 $thumb_w = $old_x * ($new_w / $old_y);

это и есть пропорциональность?

JinzMan
На сайте с 26.02.2010
Offline
6
#10

Это нужное для Вас решение. Попробуйте.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий