2012-05-23 5 views
1

У меня проблема, которую я считал легко решаемой, но получается немного сложнее, чем предполагалось.Изменение размера изображений через PHP, сохранение аспект и отсутствие использования всей моей оперативной памяти?

Я работаю над сайтом, на котором кто-то может загружать изображения для продукта, и он изменяет их размер дважды (500x500 и 150x150) на лету. Я пытаюсь сохранить соотношение сторон, например, если бы у меня было изображение 600x500, оно изменилось бы до 500x417 и 150x125.

Я нашел (много) кода, который делает это, например this class, однако я всегда сталкиваюсь с проблемами памяти. Я думаю, что класс не выгружает/уничтожает временные изображения после изменения размера.

У меня был хост, обновляющий мой лимит памяти до 64 М от 32, однако позже у меня закончилась память. Я тоже застрял с PHP 5.2.13, поэтому для меня нет сборщика мусора.

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

Может ли кто-либо:

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

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

-Просите меня, если я обойду это очень неправильно?

О, и у меня был класс WideImage, работающий в какой-то момент, и он отлично работал, а затем внезапно остановился. Я часами пытался исправить это без успеха.

У моей установки PHP есть GD, но не ImageMagick.

Спасибо!

ответ

1

Ну, мне удалось решить мою собственную проблему.

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

function resizeimage($targetw, $targeth, $input, $savedest) { 
    list($oldw, $oldh) = getimagesize($input); 
    $imgratio = ($oldw/$oldh); 
    if ($imgratio>1) { 
     $new_width = $targetw; 
     $new_height = ($targeth/$imgratio); 
    } else { 
     $new_height = $targeth; 
     $new_width = ($targetw* $imgratio); 
    } 
    $imagetemp = imagecreatetruecolor($new_width, $new_height); 
    $imageorig = imagecreatefromjpeg($input); 
    imagecopyresampled($imagetemp, $imageorig, 0, 0, 0, 0, $new_width, $new_height, $oldw, $oldh); 
    imagejpeg($imagetemp, $savedest, 95); 
    imagedestroy($imageorig); 
    imagedestroy($imagetemp); 
    unset($oldw,$oldh,$imgratio,$new_height, $new_width, $imagetemp, $imageorig); 
} 

поток в целевой ширины и высоты, а также расположение входного изображения (например, «Добавленные/изображений/testimage.jpg»), и где вы хотите его сохранять ("Добавленные/изображения/resizedtestimage. JPG ").

Надеюсь, этот фрагмент поможет кому-то в будущем!

0

Вот некоторые примеры обработки GD изображения: http://fdcl.svn.sourceforge.net/viewvc/fdcl/trunk/modules/imageprocessing/gd/module.inc?revision=212&view=markup

Одним из подходов является этот метод:

  • Open Scale изображение 500
  • imagedestroy($this->original_image)
  • Используйте изображение масштабируется до 500 и масштабирования вниз до 150
  • imagedestroy($this->image500)
  • imagedestroy($this->image150)

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

+0

Привет, я посмотрю! – Fudge01010

0

Я сделал что-то подобное, но использовал 2 приложения, которые можно запустить из командной строки на сервере Linux.

ImageMagick Mogrify: http://www.imagemagick.org/www/mogrify.html

mogrify -resize 750 "image.jpg" 

будет изменять размер до 750 пикселей в ширину

jpegoptim: http://freecode.com/projects/jpegoptim

jpegoptim "image.jpg" –max=70 --strip-all 

оптимизирует JPEG до 70% и обрезать все ненужное раздувание с картинки.

Оба запускаются из CLI и предлагают множество параметров команды, конечно, вы можете использовать один или оба с не очень сложным.

+0

Хотя эти решения выглядят действительно хорошо, мой хост, к сожалению, не основан на Linux. Это чисто веб-хостинг с PHP-сервером. Я буду помнить об этом в будущем – Fudge01010