]> git.mxchange.org Git - friendica.git/commitdiff
Fallback to gd if Imagick can't load the data
authorDomovoy <domovoy@errlock.org>
Wed, 12 Sep 2012 09:55:09 +0000 (11:55 +0200)
committerDomovoy <domovoy@errlock.org>
Wed, 12 Sep 2012 09:55:09 +0000 (11:55 +0200)
include/Photo.php

index 5b6e6d846c700d9068cfd406c9453d4d353b1ee4..8e4eb84bdba8cc6e0f6b1445edf12bd7b3946678 100644 (file)
@@ -46,9 +46,52 @@ class Photo {
         }
         $this->type = $type;
 
-        if($this->is_imagick()) {
-            $this->image = new Imagick();
-            $this->image->readImageBlob($data);
+        if($this->is_imagick() && $this->load_data($data)) {
+                       return true;
+               } else {
+                       // Failed to load with Imagick, fallback
+                       $this->imagick = false;
+               }
+               return $this->load_data($data);
+    }
+
+    public function __destruct() {
+        if($this->image) {
+            if($this->is_imagick()) {
+                $this->image->clear();
+                $this->image->destroy();
+                return;
+            }
+            imagedestroy($this->image);
+        }
+    }
+
+    public function is_imagick() {
+        return $this->imagick;
+    }
+
+    /**
+     * Maps Mime types to Imagick formats
+     */
+    public function get_FormatsMap() {
+        $m = array(
+            'image/jpeg' => 'JPG',
+            'image/png' => 'PNG',
+            'image/gif' => 'GIF'
+        );
+        return $m;
+    }
+
+    private function load_data($data) {
+               if($this->is_imagick()) {
+                       $this->image = new Imagick();
+            try {
+                               $this->image->readImageBlob($data);
+                       }
+                       catch (Exception $e) {
+                               // Imagick couldn't use the data
+                               return false;
+                       }
 
             /**
              * Setup the image to the format it will be saved to
@@ -85,45 +128,28 @@ class Photo {
                         $quality = JPEG_QUALITY;
                     $this->image->setCompressionQuality($quality);
             }
-        } else {
-            $this->valid = false;
-            $this->image = @imagecreatefromstring($data);
-            if($this->image !== FALSE) {
-                $this->width  = imagesx($this->image);
-                $this->height = imagesy($this->image);
-                $this->valid  = true;
-                imagealphablending($this->image, false);
-                imagesavealpha($this->image, true);
-            }
-        }
-    }
-
-    public function __destruct() {
-        if($this->image) {
-            if($this->is_imagick()) {
-                $this->image->clear();
-                $this->image->destroy();
-                return;
-            }
-            imagedestroy($this->image);
-        }
-    }
 
-    public function is_imagick() {
-        return $this->imagick;
-    }
-
-    /**
-     * Maps Mime types to Imagick formats
-     */
-    public function get_FormatsMap() {
-        $m = array(
-            'image/jpeg' => 'JPG',
-            'image/png' => 'PNG',
-            'image/gif' => 'GIF'
-        );
-        return $m;
-    }
+            $this->width  = $this->image->getImageWidth();
+                       $this->height = $this->image->getImageHeight();
+                       $this->valid  = true;
+
+            return true;
+               }
+
+               $this->valid = false;
+               $this->image = @imagecreatefromstring($data);
+               if($this->image !== FALSE) {
+                       $this->width  = imagesx($this->image);
+                       $this->height = imagesy($this->image);
+                       $this->valid  = true;
+                       imagealphablending($this->image, false);
+                       imagesavealpha($this->image, true);
+
+                       return true;
+               }
+               
+               return false;
+       }
 
     public function is_valid() {
         if($this->is_imagick())