Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Ужать до поределенного размера
Форумы портала PHP.SU » PHP » Программирование на PHP » Ужать до поределенного размера

Страниц (1): [1]
 

1. Бублик - 27 Января, 2009 - 10:05:04 - перейти к сообщению
Подскажите пожайлуста ф-цию или решение, которая сжимает изображение до определеного размера, для всех изображений одинакового, но чтобы не создавались белые полосы по бокам/сверху-снизу.
2. Stierus - 27 Января, 2009 - 10:11:43 - перейти к сообщению
не будет полос - будет деформация картинки (растягиваться и ужиматься по вертикали и горизонтали)
3. Бублик - 27 Января, 2009 - 10:12:56 - перейти к сообщению
Тут на форуме где-то была функция (Валенок приводил), так вот там появлялись белые полосы. А мне надо чтобы не появлялись.
4. Джур - 27 Января, 2009 - 12:14:55 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. function resize($infile,$outfile,$neww,$newh,$quality=80)
  3.   {
  4.     $pr=@getimagesize($infile);
  5.     switch($pr['mime']){
  6.       case 'image/jpeg':
  7.         $im=imagecreatefromjpeg($infile);
  8.         $ext='jpg';
  9.         break;
  10.       case 'image/png':
  11.         $im=imagecreatefrompng($infile);
  12.         $ext='png';
  13.         break;
  14.       case 'image/gif':
  15.         $im=imagecreatefromgif($infile);
  16.         $ext='gif';
  17.         break;
  18.       default:
  19.         return false;
  20.     }
  21.  
  22.     $ix = $pr[0];
  23.     $iy = $pr[1];
  24.     $iyr = $iy*$neww;
  25.     $iyr = $iyr/$ix;
  26.     $ixr = $ix*$newh;
  27.     $ixr = $ixr/$iy;
  28.     if($iyr < $newh){
  29.       $newh = $iyr;
  30.     }else{
  31.       $neww = $ixr;
  32.     }
  33.  
  34.     $im1=imagecreatetruecolor($neww,$newh);
  35.     imagecopyresampled($im1,$im,0,0,0,0,$neww,$newh,$pr[0],$pr[1]);
  36.  
  37.     if(is_string($outfile) and substr($outfile,-3)!=$ext) $ext=substr($outfile,-3);
  38.  
  39.     switch($ext){
  40.       case 'jpg':
  41.         imagejpeg($im1,$outfile,$quality);
  42.         break;
  43.       case 'png':
  44.         imagepng($im1,$outfile);
  45.         break;
  46.       case 'gif':
  47.         imagegif($im1,$outfile);
  48.         break;
  49.       default:
  50.         echo 'not_file_type';
  51.         return false;
  52.     }
  53.  
  54.     imagedestroy($im);
  55.     imagedestroy($im1);
  56.     return true;
  57.   }
5. Бублик - 27 Января, 2009 - 13:03:02 - перейти к сообщению
Джур
Почти то что нужно. При исходном размере картинки 325x488, картинка ужалась до 76х106. При том, что вызвал функцию с так resize('2.jpg', '3.jpg', 104, 106);. Как видно из результата, требованию соответствует только высота. А как исправить/написать чтобы требованиям соответствовали и ширина и высота?
6. Stierus - 27 Января, 2009 - 13:54:00 - перейти к сообщению
ты в фотошопе или в пэйнте приведи вручную к нужному размеру и посмотри на результат (всё растягивается) - тебе это нужно ?
7. Бублик - 27 Января, 2009 - 13:58:49 - перейти к сообщению
Я приводил в PAINT'e.NET. Ничего не растягивается! Изображение остается таким же, только с размерами 104x106px's
8. Stierus - 27 Января, 2009 - 14:03:20 - перейти к сообщению
325/104 = 3,125
488/106 = 4,604

пропорции разные, включай мозги.
(Добавление)
Ладн, делай как знаешь, я предупреждал, что сотворить пытаешься фигню

Удали это:
PHP:
скопировать код в буфер обмена
  1. $ix = $pr[0];
  2.     $iy = $pr[1];
  3.     $iyr = $iy*$neww;
  4.     $iyr = $iyr/$ix;
  5.     $ixr = $ix*$newh;
  6.     $ixr = $ixr/$iy;
  7.     if($iyr < $newh){
  8.       $newh = $iyr;
  9.     }else{
  10.       $neww = $ixr;
  11.     }
9. Гость - 27 Января, 2009 - 15:20:11 - перейти к сообщению
Может ему нужно иконки (thumbnails) делать надо размера 40х40 то тогда качетсво и кривизна не так важны лишб бы было видно что же нарисовано примерно
10. Stierus - 27 Января, 2009 - 15:22:12 - перейти к сообщению
JustUserR, цифры
325/104 = 3,125
488/106 = 4,604
я не из головы взял, это он дал Улыбка

ps
Давно хотел спросить про "Хостинг от 5 рублей в месяц с PHP/MySQL, unlim traffic и много другого" .. нафиг те 5 рублей ?Улыбка Ссылку не смотрел - с работы доступ закрыт, но хостинг нужен, поподробнее можно ?Улыбка
11. Гость - 27 Января, 2009 - 16:46:49 - перейти к сообщению
Цитата:
Давно хотел спросить про "Хостинг от 5 рублей в месяц с PHP/MySQL, unlim traffic и много другого" .. нафиг те 5 рублей ? Ссылку не смотрел - с работы доступ закрыт, но хостинг нужен, поподробнее можно ?
Выслал в ЛС Улыбка
12. valenok - 27 Января, 2009 - 18:39:16 - перейти к сообщению
imagecopyresampled

bool imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )
Эта функция делает очень простую задачу. Вырезает прямоугольный кусочек из одной картинки, изменяет её размер, сжимает или расширяет, растягивает или сужает и вставляет в новую картинку.

Это одна из самых дофига-аргументных функций и сейчас ты увидишь что даже тут всё очень просто.
resource $dst_image , resource $src_image - откуда и куда. Оба являются указателями на изображения в памяти.
int $dst_x , int $dst_y , int $src_x , int $src_y
Как я уже сказал, функция вырезает прямоугольные части. Тут мы обозначаем левый верхний угол нашего прямоугольники в исходном изображении и ту же точку в новом изображении.
int $dst_w , int $dst_h , int $src_w , int $src_h - ширина и высота этого прямоугольника на новом изображении и ширина и высота прямоугольника вырезанного из исходного изображения.

А теперь простыми словами и по русски:
Берем исходную картинку resource $src_image , вырезаем из неё прямоугольник левые верхний угол которого в точке int $src_x , int $src_y а высота и ширина int $src_w , int $src_h. Всё просто?
А теперь этот прямоугольник с изображением сжимаем, растягиваем, сужаем, расширяем так, чтобы его новые длина и ширина соответствовали int $dst_w , int $dst_h .
После чего этот новый прямоугольник вклиниваем на новое изображение в точке int $dst_x , int $dst_y.

http://php.su/forum/topic.php?fo...=62&topic=17

 

Powered by ExBB FM 1.0 RC1