ФорумПрограммированиеPHP для идиотов → Нетривиальный ресайз

Нетривиальный ресайз

  • imlil

    Сообщения: 50 Репутация: N Группа: Адекваты

    Spritz 4 февраля 2011 г. 0:54

    Заказчику хочется чтобы все превьюшки фоток были одинакового размера (совершенно все,несмотря на исходный размер.Красиво и в линию).
    Решил сделать при загрузке фото ресайз по одной стороне и последующей ручной обрезке ( crop & jquery),т.е если установленный размер 150 на 120,то фото обрежется на 120 по высоте и допустим на 300 по ширине (от исходного),а остальное он сам обрежет через интерфейс.


    Но проблема в ином,как сделать такой ресайз,чтобы и высота и ширина были при любом исходном размере шире 150 и выше 120 px,но в пределах разумного. Трудность в том что исходный размер может быть 2000 на 1500 или вообще 2000 на 800. Подскажите универсальный вариант
  • Sinkler

    Сообщения: 7958 Репутация: N Группа: в ухо

    Spritz 4 февраля 2011 г. 1:02, спустя 7 минут 52 секунды

    http://debugger.ru/articles/thumbnails

    читай про метод минимального сжатия
    Спустя 78 сек.
    если я понял, тебе как тут надо сделать - http://cafeyuga.ru/r-bar
    все миниатюры 150 на 150
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz 4 февраля 2011 г. 1:28, спустя 25 минут 34 секунды

    imlil, задаешь нужные тебе параметры, а исходную картинку "жмешь" по той стороне, которая будет соответствовать твоей (нужной тебе) меньшей стороне.
    То есть при нужной тебе 150*120 тебе сначала нужно найти что у исходника меньше, и если это высота, то её жмешь до 120, далее обрезаешь. Если ширина, то до 150 её жмешь и по высоте подрезаешь.
    А если же идет несостыковка (исходник к примеру 900*880), то тут нужно небольшие уравнения математические придумать.
  • Faster

    Сообщения: 1159 Репутация: N Группа: Кто попало

    Spritz 4 февраля 2011 г. 2:09, спустя 41 минуту 10 секунд

    используй коэффициент AR - аспект ратио.
    считаешь AR фотки - в зависимости от того как сказал Givi - обрезаешь нужную сторону, потом resize (а AR у тебя уже верный) и ву аля
    AR - отношение высоты к ширине к примеру
    стоит добавить, что кропить лучше с обеих сторон и сторона фотки лучше пусть будет четное число
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz 4 февраля 2011 г. 2:12, спустя 3 минуты 46 секунд

    http://community.livejournal.com/ru_php/1424646.html
    там про создание миниатюр с примерами
    Спустя 22 сек.
    на самом деле довольно тривиальный случай
    не всё полезно, что в swap полезло
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 4 февраля 2011 г. 11:27, спустя 9 часов 14 минут 52 секунды

    imlil, все что тебе надо это одна функция:
    http://ru2.php.net/manual/en/function.imagick-cropthumbnailimage.php
    Только стоит обратить внимание на первый коммент, в некоторых версиях наблюдается некорректая работа  (в некоторых 100 пудово работает). Там приведено решение и на этот случай.
    Спустя 125 сек.
    Да еще, как вариант, помню r2d2 приводил код своей функции, основанной на GD. Ищи по форуму.
  • imlil

    Сообщения: 50 Репутация: N Группа: Адекваты

    Spritz 12 февраля 2011 г. 1:56, спустя 7 дней 14 часов 28 минут

    спасибо
  • Kumar

    Сообщения: 5 Репутация: N Группа: Кто попало

    Spritz 14 февраля 2011 г. 0:54, спустя 1 день 22 часа 57 минут

    Наверное, не то, что тебе нужно, но всё-таки…
    Для создания превью писал свою функцию. Однако она ужимала фото пропорционально реальному размеру и вписывала его в рамки, переданные в качестве праметров в функцию. То есть, фото по большей своей стороне вписывалось в рамки, за пределы которого превью не имеет права выходить.
    В функцию передаются некоторые "левые" параметры - UID юзера и папка назначения. На них можно не обращать внимание.

    function resized_image ($image, $UID, $Xmax, $Ymax, $folder)
    {
    $type = $image ['type'];
    $file = $image ['tmp_name'];
    $name = $image ['name'];
    if ($type=="image/png" || $type=="image/gif" || $type=="image/jpeg")
    {
    $arr = getimagesize($file);
    $width = $arr[0];
    $height = $arr[1];
    if ($width <= $Xmax && $height <= $Ymax)
    {
    if ($type == "image/jpeg")
    {
    copy ($file, $folder."/".$UID.".jpg");
    }
    if ($type == "image/png")
    {
    copy ($file, $folder."/".$UID.".png");
    }
    if ($type == "image/gif")
    {
    copy ($file, $folder."/".$UID.".gif");
    }
    }
    else
    {
    if ($width > $Xmax && (16/9) * $width > $height)
    {
    $W=$Xmax;
    $H=($W * $height) / $width;
    }
    if ($height > $Ymax && (9/16) * $height > $width)
    {
    $H = $Ymax;
    $W = ($width * $H) / $height;
    }

    if ($type == "image/png")
    {
    $dst=imagecreatefrompng($file);
    $src=imagecreatetruecolor($W, $H);
    imagecopyresampled ($src, $dst, 0, 0, 0, 0, $W, $H, $width, $height);
    imagepng($src, $folder."/".$UID.".png");
    }
    if ($type == "image/gif")
    {
    $dst = imagecreatefromgif($file);
    $src = imagecreatetruecolor($W, $H);
    imagecopyresampled ($src, $dst, 0, 0, 0, 0, $W, $H, $width, $height);
    imagejpeg($src, $folder."/".$UID.".gif");
    }
    if ($type == "image/jpeg")
    {
    $dst=imagecreatefromjpeg($file);
    $src=imagecreatetruecolor($W, $H);
    imagecopyresampled ($src, $dst, 0, 0, 0, 0, $W, $H, $width, $height);
    imagejpeg($src, $folder."/".$UID.".jpg");
    }
    }
    return true;
    }
    else return false;
    }
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 14 февраля 2011 г. 11:11, спустя 10 часов 17 минут 44 секунды


    и вписывала его в рамки
    Я, конечно, не знаю чего окончательно ТС надо. Но вписывание в рамки с пропорциональным изменением размеров, однозначно не дает эффекта "все превью одного размера", о котором идет речь в первом посте.
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 14 февраля 2011 г. 12:20, спустя 1 час 8 минут 29 секунд

    ололол!!!!! даешь саол!
    Сапожник без сапог
  • fgets

    Сообщения: 1099 Репутация: N Группа: Кто попало

    Spritz 14 февраля 2011 г. 13:39, спустя 1 час 19 минут 39 секунд

    if ($type == "image/jpeg")
    {
    $dst=imagecreatefromjpeg($file);


    $img = 'imagecreatefrom'.$ext;
    $img($file);
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 14 февраля 2011 г. 13:49, спустя 9 минут 53 секунды

    jpg
  • fgets

    Сообщения: 1099 Репутация: N Группа: Кто попало

    Spritz 14 февраля 2011 г. 14:01, спустя 11 минут 58 секунд


    jpg


    так миме же, миме то jpeg только
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 14 февраля 2011 г. 14:32, спустя 30 минут 56 секунд

    pjpeg (progressive)
  • fgets

    Сообщения: 1099 Репутация: N Группа: Кто попало

    Spritz 14 февраля 2011 г. 15:14, спустя 41 минуту 25 секунд


    pjpeg (progressive)


    и что? делаешь функцию imagecreatefrompjpeg(); и возвращаешь im

Пожалуйста, авторизуйтесь, чтобы написать комментарий!