Обрезка фотографий

Тема в разделе "PHP", создана пользователем pixelranger, 18 фев 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. pixelranger

    pixelranger

    Регистр.:
    24 июн 2006
    Сообщения:
    386
    Симпатии:
    117
    Нужно сделать фотке превью, сначала уменьшить, чтобы картинка не была меньше превью(по пропорциям), а потом обрезать лишнее. phpthumb не предлагать!
     
  2. *mm*

    *mm* Создатель

    Регистр.:
    1 окт 2009
    Сообщения:
    29
    Симпатии:
    2
    Не очень понятно, что Вам требуется сделать? Вам нужно создать уменьшенную копию фотографии?
     
  3. pixelranger

    pixelranger

    Регистр.:
    24 июн 2006
    Сообщения:
    386
    Симпатии:
    117
    Да, но чтобы вписалась в новые пропорции, а лишнее обрезалось.
     
  4. *mm*

    *mm* Создатель

    Регистр.:
    1 окт 2009
    Сообщения:
    29
    Симпатии:
    2
    Можно вписаться в новые пропорции и с сохранением исходного изображения, или Вам принципиально надо обрезать?
     
  5. pixelranger

    pixelranger

    Регистр.:
    24 июн 2006
    Сообщения:
    386
    Симпатии:
    117
    Ну если мы впишем(по ширине), то фотки, допустим по высоте будут разные...при условии что сохраняем пропорции, а если нет то все будет растянуто..надо как бы из центра вписывать в новые размеры после уменьшения и лишнее убирать.
     
  6. *mm*

    *mm* Создатель

    Регистр.:
    1 окт 2009
    Сообщения:
    29
    Симпатии:
    2
    Ну так для вертикальных и горизонтальных фотографий свои размеры, это логично, и они естественно будут отличаться, к примеру горизонтальная фотография имеет размеры (h100 w300), а должна стать -(h50 w150), вертикальная - (h300 w100) -> (р150 w50). Таким образом если мы масштабируем фотографию, сохраняя пропорции исходного изображения, ничего не нужно обрезать, и ничего не будет растянуто..
     
  7. pixelranger

    pixelranger

    Регистр.:
    24 июн 2006
    Сообщения:
    386
    Симпатии:
    117
    а мне надо так: (h100 w300), а должна стать -(h50 w50), понимаете о чем я?
     
  8. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    1) Выбираешь по какой стороне будет пропорция(ширина либо высота). Допустим по ширине макс. 50 пикселей;
    2) определяешь коэффициент пропорции: К = исходная ширина/50 пикселей;
    3) Определяешь новую высоту по пропорции: Новая высота = Старая высота/K;
    4) Получаешь новую уменьшенную картинку;
    5) Обрезаешь новую уменьшенную картинку до 50*50 px.
     
  9. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    975
    Симпатии:
    255
    Посмотрите класс, который называется мини фотошоп на php

    http://www.progerin.org.ua/index.php?showtopic=3989

    здесь примеры любых обрезок с картинками, в.т.ч. и те, которые Вам нужны.
     
    pixelranger нравится это.
  10. *mm*

    *mm* Создатель

    Регистр.:
    1 окт 2009
    Сообщения:
    29
    Симпатии:
    2
    Теперь понятно, ну для того чтобы получилось более менее качественно,
    нужно будет сначала сделать ресайз, а потом обрезать получившуюся миниатюру до нужных Вам размеров.
    Вот функция, которая будет сжимать изображение, сохраняя его пропорции:
    PHP:
    //$filename - путь к исходному файлу
    //$smallimage - путь к уменьшенной копии
    //$w - ширина уменьшенной фотографии
    //$h - высота уменьшенной фотографии
    function resizeimg($filename$smallimage$w$h
      { 
        
    $ratio $w $h
        list(
    $width$height) = getimagesize($filename); 
        if ((
    $width $w) && ($height $h))
        {
          
    copy($filename$smallimage);
          return 
    true
        }
        
    $src_ratio $width$height
        if (
    $ratio $src_ratio$h $w/$src_ratio
        else 
    $w $h*$src_ratio
        
    $dest_img imagecreatetruecolor($w$h);   
        
    $src_img imagecreatefromjpeg($filename);                       
        
    imagecopyresampled($dest_img$src_img0000$w$h$width$height);
        
    imagejpeg($dest_img$smallimage);                       
        
    imagedestroy($dest_img); 
        
    imagedestroy($src_img); 
        return 
    true;          
      } 
    Встроенной функции по обрезке фотографий в PHP нет. Можно воспользоваться либо imagecopy, либо писать свою.
    Вот функция, которая позволит Вам обрезать фотографию, выбрав ее середину:
    PHP:
    // $fileresized - путь к уже уменьшенному файлу (миниатюре)
    // $x1,$y1 - Верхняя левая точка, вырезаемого кусочка изображения
    // $x2,$y2 - Нижняя правая точка, вырезаемого кусочка изображения
    function ImageCut($fileresized,$x1,$y1,$x2,$y2){
       if(
    file_exists($fileresized)){
         
    $w=$x2-$x1;
         
    $h=$y2-$y1;
         
    //создадим пустое изображение по заданным размерам
         
    $dest_img=@imagecreatetruecolor($w,$h);
         
    $src_img=@imagecreatefromjpeg($fileresized);
         
    //Копируем
         
    @imagecopyresampled($dest_img,$src_img,0,0,$x1,$y1,$w,$h,$w,$h);
         
    //сохраняем уменьшенную копию в файл
         
    @imagejpeg($dest_img,"filename.jpg");
         
    //чистим память от созданных изображений
         
    @imagedestroy($dest_img);
         @
    imagedestroy($src_img);
         return 
    true;
       }else{
         return 
    false;
       }
     }
     
    //Вызываем функцию
     
    ImageCut("your-image.jpg",0,0,100,100); 
    PS
    При желании можно обучить функцию работать не только с jpeg, каковой она сейчас является.
    Как связать эти две функции, думаю разберетесь, будут вопросы, пишите.

    Добавлено через 4 минуты
    Этот класс при обрезке не сохраняет пропорции, а автору нужно, чтобы пропорции сохранялись.
     
    pixelranger нравится это.
Статус темы:
Закрыта.