2015-12-04 2 views
2
foreach ($task->getDefects() as $defect) 
{ 
     $photo = ($defect->getPhoto() != '') ? $path($defect->getPhoto()) : null; 

Так что в данный момент, я могу предположить, если $photo не null, то оно содержит полный путь к изображению на моем сервере.Простейшее возможный способ изменить размер изображения в PHP

То, что я хочу сделать, это:

  • Если изображение выше определенного размера файла, скажем, 100kb; затем
  • Измените размер изображения до доли его текущего размера. Скажем, если бы размер был 400kb, то уменьшите его до 25% от его текущего размера. Если это было 200 кб, уменьшите его до 50% от его текущего размера и т. Д.

Что такое самый простой способ сделать это в PHP?

Если возможно, я хотел бы сделать это без включения каких-либо компонентов или прикоснуться к php.ini, но я понимаю, если это неизбежно ...

Благодаря

+1

imagemagick - отличная библиотека, которая преобразует изображения в соответствии с вашими потребностями на лету, но вы должны изменить свой файл php.ini –

ответ

2

Это не самое простое решение но использование библиотеки Imagine значительно сокращает время разработки. Вы должны включить GD или Imagick из своего php.ini. Вы можете использовать следующий класс внутри вашего foreach.

composer.json

{ 
    "require": { 
     "imagine/imagine": "^0.6.3" 
    } 
} 

ImageProcessing.php

<?php 
class ImageProcessing 
{ 
    private $resizeRatio = array(
     400 => 0.5, // 50% 
     200 => 0.25 // 25% 
    ); 

    private $filePath; 

    private $originalSize; 

    public function __construct($filePath) 
    { 
     $this->filePath = $filePath; 
     list($this->originalSize['width'], $this->originalSize['height']) = getimagesize($this->filePath); 
    } 

    public function getOriginalSize() 
    { 
     return $this->originalSize; 
    } 

    public function getFileSizeInKb() 
    { 
     $imgSizeByte = filesize($this->filePath); 
     return round($imgSizeByte/1024); 
    } 

    public function getReducePercentageByFileSize() 
    { 
     $fileSize = $this->getFileSizeInKb(); 

     foreach ($this->resizeRatio as $size => $percentage) { 
      if ($fileSize >= $size) { 
       return $percentage; 
      } 
     } 

     // return 100% if not found in size ratio 
     return 1; 
    } 

    public function getReduceSize() 
    { 
     $reducePercentage = $this->getReducePercentageByFileSize(); 
     $reduceSize = array(
      'width' => $this->originalSize['width'] * $reducePercentage, 
      'height'=> $this->originalSize['height'] * $reducePercentage 
     ); 
     return $reduceSize; 
    } 

    public function resize() 
    { 
     $reduceSize = $this->getReduceSize(); 
     $imagine = new Imagine\Gd\Imagine(); 
     $size = new Imagine\Image\Box($reduceSize['width'], $reduceSize['height']); 
     $mode = Imagine\Image\ImageInterface::THUMBNAIL_INSET; 
     $imagine 
      ->open($this->filePath) 
      ->thumbnail($size, $mode) 
      ->save($this->filePath); 
    } 


} 
?> 

Использование

$filePath = 'image.png'; 
$imgProcessing = new ImageProcessing($filePath); 
echo 'File size: ' . $imgProcessing->getFileSizeInKb() . " KB \n"; 
echo 'Reduce Percentage : ' . $imgProcessing->getReducePercentageByFileSize() . "\n"; 
echo 'Original Size : ' . print_r($imgProcessing->getOriginalSize(), true) . "\n"; 
echo 'ReduceSize Size : ' . print_r($imgProcessing->getReduceSize(), true) . "\n"; 
$imgProcessing->resize(); 

Выход

File size: 273 KB 
Reduce Percentage : 0.25 
Original Size : Array 
(
    [height] => 450 
    [width] => 800 
) 

ReduceSize Size : Array 
(
    [width] => 200 
    [height] => 112.5 
) 

В вашем классе

<?php 
require __DIR__ . '/vendor/autoload.php'; 

foreach ($task->getDefects() as $defect) 
{ 
    $photo = ($defect->getPhoto() != '') ? $path($defect->getPhoto()) : null; 
    if (!empty($photo)) { 
     $image = new ImageProcessing($photo); 
     $image->resize(); 
    } 

} 
?> 
Смежные вопросы