From de877f3b6abbf86b1258c007a3a9278375d7e7f9 Mon Sep 17 00:00:00 2001 From: "DESKTOP-H825VC6\\geckon01" Date: Tue, 17 Oct 2023 02:00:17 +0300 Subject: [PATCH] Better image type recognition with exif --- src/SimpleImageCompressor.php | 46 +++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/src/SimpleImageCompressor.php b/src/SimpleImageCompressor.php index 40f8d64..ddc9e96 100644 --- a/src/SimpleImageCompressor.php +++ b/src/SimpleImageCompressor.php @@ -24,14 +24,17 @@ class SimpleImageCompressor private int $approxMinimumHeight = 90; private int $approxMinimumWidth = 90; + private bool $exifLoaded = false; + /** * SimpleImageCompressor constructor. - * @param $url + * @param $url url or path from where to load file */ private function __construct($url) { $this->imageResourceUrl = $url; + $this->exifLoaded = in_array("exif", get_loaded_extensions()); } @@ -82,17 +85,46 @@ class SimpleImageCompressor * Determine current loaded image type */ private function loadImageType() { - $filetype = ''; + $this->imageType = "image"; + + if($this->exifLoaded) + { + switch (exif_imagetype($this->imageResourceUrl)) + { + case IMAGETYPE_GIF: + $this->imageType = 'image/gif'; + break; + case IMAGETYPE_JPEG: + $this->imageType = 'image/jpeg'; + break; + case IMAGETYPE_PNG: + $this->imageType = 'image/png'; + break; + case IMAGETYPE_BMP: + $this->imageType = 'image/bmp'; + break; + case IMAGETYPE_WEBP: + $this->imageType = 'image/webp'; + break; + case IMAGETYPE_ICO: + $this->imageType = 'image/ico'; + break; + default: + break; + } + return; + } + + //Fallback to bytes recognition + trigger_error("simple-image-compressor: Exif extension not found. Image MIME type recognition may be inaccurate."); if (substr($this->imageData, 0, 2) === "\xFF\xD8") { - $filetype = 'image/jpeg'; + $this->imageType = 'image/jpeg'; } else if (substr($this->imageData, 0, 3) === "\x89\x50\x4E") { - $filetype = 'image/png'; + $this->imageType = 'image/png'; } else if (substr($this->imageData, 0, 4) === "\x47\x49\x46\x38") { - $filetype = 'image/gif'; + $this->imageType = 'image/gif'; } - - $this->imageType = $filetype; } /**