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

Форум PHP

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

 

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

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

тема: создание изображения с заданными h и w
 
 автор: vrazbros   (25.11.2007 в 21:52)   письмо автору
 
 

у softtime на сайт есть хор фотогаллерея в которой с помощью util.php создаются уменьшеные комии изображения. те говоришь resizeimg($image, $smallimage, 160, 240) и он создается изображение с h и w близкими к 160 и 240 близкими потомучто сохраняются пропорции исходного снимка.

 if ($ratio<$src_ratio) 
    { 
      $h = $w/$src_ratio; 
    } 
    else 
    { 
      $w = $h*$src_ratio; 
    }


, а если пропорции НЕ сохранять то уменьшная копия получается или вытянута или растянута.
как сделать чтобы уменьшеное изображение не было растянутым, но w и h было таким каким я его задаю, (160, 240) к примеру.

   
 
 автор: retsoul   (25.11.2007 в 22:07)   письмо автору
 
   для: vrazbros   (25.11.2007 в 21:52)
 


<?
$h 
$_GET['height'];
$w $_GET['width'];
?>

или то же самое, только POST -ом, всё зависит от того, что вам больше нравиться
и плюс ещё не помешает в таком случае проверка эти переменных на правильность значений, например, чтобы избежать ошибок при введении текста вместо цифр

   
 
 автор: vrazbros   (25.11.2007 в 22:41)   письмо автору
 
   для: retsoul   (25.11.2007 в 22:07)
 

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

А я хочу например уменьшить картинку 1024x768 и получить 160x240, или 1500x700 и получить 160x240 ) ктонить сталкивался с такой проблемой ?

   
 
 автор: retsoul   (25.11.2007 в 22:47)   письмо автору
 
   для: vrazbros   (25.11.2007 в 22:41)
 

всё просто:
берёшь 2 переменные, с теми значениями, которые тебе нужны и вставляешь их в том месте, где идёт определение пропорции, то есть, вместо пропорциональных значений применяешь свои

при таком подходе есть один недостаток - придётся проверять ширину и высоту исходного рисунка, чтобы не получить вместо вытянутого рисунка - сплющенный

   
 
 автор: vrazbros   (25.11.2007 в 22:55)   письмо автору
 
   для: retsoul   (25.11.2007 в 22:47)
 

так я так и делаю и уменьшенное изображение получается сплющенным.

   
 
 автор: retsoul   (25.11.2007 в 23:01)   письмо автору
 
   для: vrazbros   (25.11.2007 в 22:55)
 

тогда вставьте проверку и взавизимости от пропорций исходного изображения меняйте значения h и w

   
 
 автор: vrazbros   (25.11.2007 в 23:30)   письмо автору
 
   для: retsoul   (25.11.2007 в 23:01)
 

это 1 проблема, такой вариант я тоже пробовал, проверку использовал (см 1 пост) исходное изображение выглядит нормально, но в этом случаи его размеры зависят от оригинала, а мне нужно чтобы не зависели.

   
 
 автор: retsoul   (25.11.2007 в 23:38)   письмо автору
 
   для: vrazbros   (25.11.2007 в 23:30)
 

да, но я предлагал использовать при этом свои размеры, а соответственно - проверка должна возвращать ваши $w и $h, а не вычислять их из размеров исходного изображения, просто при проверке определяете, куда ставить 190px, а куда 240px

Допустим:
$a - ширина исходного изображения
$b - высота исходного изображения
$h =190;
$w = 240;

тогда:
если ($a > $b) {
  $h =190;
  $w = 240;
  }
иначе {
  $h = 240;
  $w =190;
  }

   
 
 автор: Радин А.М.   (08.01.2008 в 23:53)   письмо автору
 
   для: vrazbros   (25.11.2007 в 21:52)
 

Я сейчас тоже как раз над этим голову ломаю.

В своё время я где-то видел неработающую функцию, где описывался примерный алгоритм переразмеривания изображений.

В обобщении того, что помню и до чего сам додумался имеем:
1. Изображения бывают 3-х типов: а) вытянутые вертикально, б) вытянутые горизонтально, в) квадратные - частный случай.

2. Основная часть большинства изображений приходится на их центр. Однако в большинстве фотографий центр смещён выше абсолютного центра.

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

б) с горизонтальными изображениями проще: примерно 15% слева и справа. около 5 % всерху, и до 15 % снизу.

в) в квадратных изображениях некий гибрид: по 5% слева и справа, 5% сверху, до 20 % снизу.

... это примерно от фонаря взято путём мозгового штурма проблемы и анализа имеющихся фоток.

Собственно, функция почти готова:


function create_preview ($original_file, $preview_file, $pre_width, $pre_height)
{
  // функция, создающая превью-файл
  // $original_file  - полный путь к оригинальному (входящему) файлу
  // $preview_file - полный путь на создаваемый (выходящий) файл
  // $pre_width - ширина создаваемого файла
  // $pre_height - высота создаваемого файла

  // определяем размер (коэффициент соотношения сторон) будущего изображения
  $ratio = $pre_width / $pre_height;

  // извлекаем массив, содержащий параметры оригинального (входного) изображения
  // где элементы [0] - ширина, [1] - высота этого изображения
  $size_img = getimagesize($original_file);

  // определяем размер (коэффициент соотношения сторон) оригинального изображения
  $orig_ratio = $size_img[0] / $size_img[1];
  
  // создаём пустое изображение по заданным параметрам будущего изображения
  $pre_img = imagecreatetruecolor($pre_width, $pre_height);

  // создаём jpeg-изображение из файла оригинала
  $orig_img = imagecreatefromjpeg($original_file);

  /************************************************************************
  **    А ЗДЕСЬ НАДО ПРИДУМАТЬ МАТЕМАТИКУ
  **
  **  то есть придумать, СКОЛЬКО НАДО ОТКУДА ОТРЕЗАТЬ
  **
  ************************************************************************/

  // cut_left - отрезать слева от оригинала (в пикселях)
  // cut_right - отрезать справа от оригинала (в пикселях)
  // cut_top - отрезать сверху от оригинала (в пикселях)
  // cut_bottom - отрезать снизу от оригинала (в пикселях)

  imagecopyresampled($pre_img, $orig_img, 0, 0, $cut_left, $cut_top, $pre_width, $pre_height, ($size_img[0] - $cut_right), ($size_img[1] - $cut_bottom));

  // сохраняем уменьшенную копию ориг. файа в файл-превью
  imagejpeg($pre_img, $preview_file);

  // очищаем память от временных (созданных нами) изображений
  imagedestroy($pre_img);
  imagedestroy($orig_img);

  // конец функции
}

// инициализируем функцию (мои превьюшки размером 150х90)

create_preview ($original_file, $preview_file, 150, 90);



Добавлю, что математика должна быть построена так, чтобы ОТРЕЗАННОЕ оригинальное изображение стало пропорционально будущему превью-изображению.

Причём: по идее, надо разработать какой-то коэффициент отрезания, чтобы (если не понравится превьюшка) можно было его просто увеличить или уменьшить и пересоздать превью

У меня наступило отупение, потому математику придумать уже не в состоянии. Придумайте кто-нть, пожалуйста :)

P.S.: Функцию создавал на основе той, что представлена здесь: http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=41788

   
Rambler's Top100
вверх

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