2016-05-15 2 views
1

Я хочу сохранить соотношение сторон изображений при изменении их размеров. Я получил 94 000 изображений, которые мне нужно отображать в виде изображений предварительного просмотра на социальном сайте. Задача, которую я получил, - это то, что некоторые пользователи загружают полноразмерные фотографии, в результате они кажутся растянутыми после повторной калибровки. Для реализации этого я использую код-воспламенитель. Имена файлов находятся в таблице базы данных. Это код, я используюImagick photo multiple image resize crop без искажения/растяжения php

 if (file_exists($_SERVER["DOCUMENT_ROOT"]."/uploads/profiles /purchased_profiles/".$images_->_file_name)) { 
//echo "The file $filename exists"; 


     $thumb = new Imagick(); 

     $thumb->readImage($_SERVER["DOCUMENT_ROOT"]."/uploads/profiles/purchased_profiles/".$images_->_file_name); 
    $orientation = $thumb->getImageOrientation(); 

switch($orientation) { 
    case imagick::ORIENTATION_BOTTOMRIGHT: 
     $thumb->rotateimage("#000", 180); // rotate 180 degrees 
    break; 

    case imagick::ORIENTATION_RIGHTTOP: 
     $thumb->rotateimage("#000", 90); // rotate 90 degrees CW 
    break; 

    case imagick::ORIENTATION_LEFTBOTTOM: 
     $thumb->rotateimage("#000", -90); // rotate 90 degrees CCW 
    break; 
} 
      $thumb->resizeImage(160,160,Imagick::FILTER_LANCZOS,1); 

      $thumb->writeImage($_SERVER["DOCUMENT_ROOT"]."/uploads/profiles/purchased_profiles/160x160/".$images_->_file_name); 
     $thumb->clear(); 
    $thumb->destroy(); 
    } 

ответ

1

Если изображения загружаются с различными размерами сво реальный вызов Если я объединить найденное решение здесь how do i use imagick in php? (resize & crop) и код я могу придумать следующий

 if (file_exists($_SERVER["DOCUMENT_ROOT"]."/uploads/profiles/purchased_profiles/".$images_->_file_name)) { 



     $thumb = new Imagick(); 

     $thumb->readImage($_SERVER["DOCUMENT_ROOT"]."/uploads/profiles/purchased_profiles/".$images_->_file_name); 

$orientation = $thumb->getImageOrientation(); 

switch($orientation) { 
    case imagick::ORIENTATION_BOTTOMRIGHT: 
     $thumb->rotateimage("#000", 180); // rotate 180 degrees 
    break; 

    case imagick::ORIENTATION_RIGHTTOP: 
     $thumb->rotateimage("#000", 90); // rotate 90 degrees CW 
    break; 

    case imagick::ORIENTATION_LEFTBOTTOM: 
     $thumb->rotateimage("#000", -90); // rotate 90 degrees CCW 
    break; 
} 

      //now check the width 
     $width=$thumb->getImageWidth(); 

     //now check height 
     $height=$thumb->getImageHeight(); 

     if ($height>$width) { 

     $new_height=160; 
     $new_width=(int)($width/$height*160); 

     $thumb->resizeImage($new_width,$new_height,Imagick::FILTER_LANCZOS,1); 

     $cropWidth = $thumb->getImageWidth(); 
     $cropHeight = $thumb->getImageHeight(); 
     $cropZoom=1; 

    if ($cropZoom) { 
     $newWidth = $cropWidth/2; 
     $newHeight = $cropHeight/2; 

    $thumb->cropimage(
     $new_width, 
     $new_width, 
     0, 
     0 
    ); 


     } 
    } 
    elseif ($width>$height) { 
    # code... 

     $new_width=160; 

     $new_height=(int)($height/$width*160); 

     $thumb->resizeImage($new_width,$new_height,Imagick::FILTER_LANCZOS,1); 
     } 
     else{ 

     $thumb->resizeImage(160,160,Imagick::FILTER_LANCZOS,1); 
     } 



      $thumb->writeImage($_SERVER["DOCUMENT_ROOT"]."/uploads/profiles/purchased_profiles/160x160/".$images_->_file_name); 
     $thumb->clear(); 
     $thumb->destroy(); } 

Возможно, вам потребуется обрезать, если высота изображения больше ширины, поэтому я решил обрезать с размерами, равными ширине от левого угла, скорее всего, вы не пропустите лицо человека таким образом. Удачи

+0

Спасибо, что магия даже не редактировала ваш код –