+ /**
+ * 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
+ */
+ $map = $this->get_FormatsMap();
+ $format = $map[$type];
+ $this->image->setFormat($format);
+
+ // Always coalesce, if it is not a multi-frame image it won't hurt anyway
+ $this->image = $this->image->coalesceImages();
+
+ /**
+ * setup the compression here, so we'll do it only once
+ */
+ switch($this->getType()){
+ case "image/png":
+ $quality = get_config('system','png_quality');
+ if((! $quality) || ($quality > 9))
+ $quality = PNG_QUALITY;
+ /**
+ * From http://www.imagemagick.org/script/command-line-options.php#quality:
+ *
+ * 'For the MNG and PNG image formats, the quality value sets
+ * the zlib compression level (quality / 10) and filter-type (quality % 10).
+ * The default PNG "quality" is 75, which means compression level 7 with adaptive PNG filtering,
+ * unless the image has a color map, in which case it means compression level 7 with no PNG filtering'
+ */
+ $quality = $quality * 10;
+ $this->image->setCompressionQuality($quality);
+ break;
+ case "image/jpeg":
+ $quality = get_config('system','jpeg_quality');
+ if((! $quality) || ($quality > 100))
+ $quality = JPEG_QUALITY;
+ $this->image->setCompressionQuality($quality);
+ }
+
+ // The 'width' and 'height' properties are only used by non-Imagick routines.
+ $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;
+ }
+