Посетитель
Покинул форум
Сообщений всего: 463
Дата рег-ции: Июнь 2012
Откуда: Санкт-Петербург
Помог: 5 раз(а)
|
Тестирую модуль загрузки изображений на своем сайте и нащупал несколько неприятных звоночков:
1. При загрузке большого одноцветного PNG-изображения 2500х1700 на входе оно весит 20Кб, на выходе уменьшенная копия 150х100px весит 4Кб, а большая версия от оригинала отличается уже в 50-70 раз и переваливаем за 1МБ и это с максимальной степенью сжатия, если не сжимать то переваливает за 13МБ... Пробывал использовать PNG_FILTER_ALL никак на размер не влияет.
2. При использовании степени сжатия 9 для png-изображений большие изображения грузятся секунд 15-20
PHP:
скопировать код в буфер обмена
class ResizeImage { const MAX_LARGE_WIDTH = 2600; const MAX_LARGE_HEIGHT = 1600; const MAX_ICON_WIDTH = 150; const MAX_ICON_HEIGHT = 150; private $image; private $imageType; // FALSE or jpg,gif,png private $alpha; private $originWidth; private $originHeight; private $iconImage; private $largeImage; public function __construct($imageName) { if (!$this->imageIdentification($imageName)) { throw new \InvalidArgumentException('file can\'t be open as image[jpg,gif or png]'); } $this->largeImage = $this->resizeImage(self::MAX_LARGE_WIDTH, self::MAX_LARGE_HEIGHT); $this->iconImage = $this->resizeImage(self::MAX_ICON_WIDTH, self::MAX_ICON_HEIGHT); } public function getLargeImage() { return $this->largeImage; } public function getIconImage() { return $this->iconImage; } public function getImageType() { return $this->imageType; } public function getWidth() { } public function getHeight() { } public function saveImage($imageName, $icon = false) : bool { $image = $icon ? $this->getIconImage() : $this->getLargeImage(); $re = false; switch ($this->imageType) { case 'jpg': break; case 'png': $re = imagepng($image, $imageName, 9 , PNG_ALL_FILTERS ); break; case 'gif': break; } return $re; } private function imageIdentification($imageName) { $this->image = $image; $this->imageType = 'jpg'; $this->alpha = false; $this->image = $image; $this->imageType = 'png'; $this->alpha = true; $this->image = $image; $this->imageType = 'gif'; $this->alpha = false; } else { return false; } $this->originWidth = imagesx($this->image); $this->originHeight = imagesy($this->image); return true; } private function resizeImage($maxWidth, $maxHeight) { $k = max($this->originWidth / $maxWidth, $this->originHeight / $maxHeight); if ($k <= 1) { return $this->image; } $width = round($this->originWidth / $k); $height = round($this->originHeight / $k); $newImage = $this->createBaseImage($width, $height); 0, 0, 0, 0, $width, $height, $this->originWidth, $this->originHeight); return $newImage; } private function createBaseImage(int $width, int $height) { return $image; } }
Может это дело как то можно оптимизировать? (для больших изображений сейчас буду переделывать сохранение оригинального изображения вместо полученного ресурса)
(Добавление)
Попровил сейв картинок png ... раз php с ними так работает думаю еще стоит добавить для png-картинок выходящих за допустимые размеры сообщение об ошибке
PHP:
скопировать код в буфер обмена
public function saveImage($imageName, $icon = false) : bool { $image = $icon ? $this->getIconImage() : $this->getLargeImage(); $re = false; switch ($this->imageType) { case 'jpg': break; case 'png': if((imagesx($image) == $this->originWidth) && (imagesy($image) == $this->originHeight)) { if(copy($this->originImageName, $imageName)) { $re = true; } } if(!$re) { } break; case 'gif': break; } return $re; }
|