Я работаю над приложением, в котором пользователи могут загружать изображения (на мой сервер CakePHP 2.7.2), где они хранятся. Эти изображения время от времени бывают довольно большими (например, изображения iPhone размером около 7-8 МБ).
Приложение показывает эти изображения в приложении (но это занимает очень много времени из-за больших данных, которые необходимо загрузить).
Каков наилучший способ масштабирования изображений до 30 КБ с использованием PHP? Я хочу, чтобы изображения были эффективными по размеру и качеству. Важным требованием является соблюдение соотношения ширины и высоты!
Вы можете попробовать Адаптивные изображения PHP скрипт.
Adaptive Images определяет размер экрана вашего посетителя и автоматически создает, кэширует и доставляет соответствующие масштабированные версии устройства встроенных изображений HTML вашей веб-страницы. Никаких изменений разметки не требуется. Он предназначен для использования с адаптивными дизайнами и должен сочетаться с методами Fluid Image.
Чтобы заставить его работать в CakePHP:
Загрузите его на свой /app/webroot/
папка
Изменить вас /app/webroot/.htaccess
и добавьте следующее перед правилами CakePHP mod_rewrite:
RewriteCond %{REQUEST_URI} !optional_path_to_exclude/
RewriteRule \.(?:jpe?g|gif|png)$ adaptive-images.php [L]
редактировать /app/webroot/adaptive_images.php
и заменить строку 16:
$cache_path = "ai-cache";
с
$cache_path = "/app/tmp/cache/ai-cache/";
и строка 30:
$source_file = $document_root.$requested_uri;
с
$source_file = $document_root.'/app/webroot'.$requested_uri;
Этот последний шаг может отличаться в зависимости от конфигурации вашего виртуального хоста.
Существует два основных способа обработки изображений с помощью PHP: GD а также ImageMagick.
Для GD изменение масштаба изображения легче всего выполнить с imagecopyresampled (). Вам понадобится код примерно так:
$image = imagecreatefromstring($imageContents); //or one of the image imagecreatefrom* functions
$newImage = imagecreatetruecolor($newWidth, $newHeight);
imagecopyresampled($newImage, $image, 0, 0, 0, 0, $newWidth, $newHeight, $srcWidth, $srcHeight);
ob_start();
imagepng($newImage, null); //or imagejpeg as appropriate
$output = ob_get_contents();
ob_end_clean();
//do something with $output