]> git.mxchange.org Git - friendica.git/blobdiff - src/Object/Image.php
Merge pull request #4683 from annando/update-self
[friendica.git] / src / Object / Image.php
index 79fbf3a99038a1b3dd327c1f6fecf8711c1b6402..9692b84715c1d0e47db33de116c2e72ddd248a02 100644 (file)
@@ -8,15 +8,15 @@ namespace Friendica\Object;
 use Friendica\App;
 use Friendica\Core\Cache;
 use Friendica\Core\Config;
+use Friendica\Core\L10n;
 use Friendica\Core\System;
 use Friendica\Database\DBM;
 use Friendica\Model\Photo;
+use Friendica\Util\Network;
 use Exception;
 use Imagick;
 use ImagickPixel;
 
-require_once "include/photos.php";
-
 /**
  * Class to handle images
  */
@@ -43,13 +43,13 @@ class Image
                if (class_exists('Imagick')) {
                        // Imagick::queryFormats won't help us a lot there...
                        // At least, not yet, other parts of friendica uses this array
-                       $t = array(
+                       $t = [
                                'image/jpeg' => 'jpg',
                                'image/png' => 'png',
                                'image/gif' => 'gif'
-                       );
+                       ];
                } else {
-                       $t = array();
+                       $t = [];
                        $t['image/jpeg'] ='jpg';
                        if (imagetypes() & IMG_PNG) {
                                $t['image/png'] = 'png';
@@ -111,15 +111,15 @@ class Image
 
        /**
         * @brief Maps Mime types to Imagick formats
-        * @return arr With with image formats (mime type as key)
+        * @return array With with image formats (mime type as key)
         */
        public static function getFormatsMap()
        {
-               $m = array(
+               $m = [
                        'image/jpeg' => 'JPG',
                        'image/png' => 'PNG',
                        'image/gif' => 'GIF'
-               );
+               ];
                return $m;
        }
 
@@ -142,7 +142,7 @@ class Image
                         * Setup the image to the format it will be saved to
                         */
                        $map = self::getFormatsMap();
-                       $format = $map[$type];
+                       $format = $map[$this->type];
                        $this->image->setFormat($format);
 
                        // Always coalesce, if it is not a multi-frame image it won't hurt anyway
@@ -338,42 +338,7 @@ class Image
                        }
                }
 
-
-               if ($this->isImagick()) {
-                       /*
-                        * If it is not animated, there will be only one iteration here,
-                        * so don't bother checking
-                        */
-                       // Don't forget to go back to the first frame
-                       $this->image->setFirstIterator();
-                       do {
-                               // FIXME - implement horizantal bias for scaling as in followin GD functions
-                               // to allow very tall images to be constrained only horizontally.
-
-                               $this->image->scaleDown($dest_width, $dest_height);
-                       } while ($this->image->nextImage());
-
-                       // These may not be necessary any more
-                       $this->width  = $this->image->getImageWidth();
-                       $this->height = $this->image->getImageHeight();
-
-                       return;
-               }
-
-
-               $dest = imagecreatetruecolor($dest_width, $dest_height);
-               imagealphablending($dest, false);
-               imagesavealpha($dest, true);
-               if ($this->type=='image/png') {
-                       imagefill($dest, 0, 0, imagecolorallocatealpha($dest, 0, 0, 0, 127)); // fill with alpha
-               }
-               imagecopyresampled($dest, $this->image, 0, 0, 0, 0, $dest_width, $dest_height, $width, $height);
-               if ($this->image) {
-                       imagedestroy($this->image);
-               }
-               $this->image = $dest;
-               $this->width  = imagesx($this->image);
-               $this->height = imagesy($this->image);
+               return $this->scale($dest_width, $dest_height);
        }
 
        /**
@@ -562,23 +527,7 @@ class Image
                        }
                }
 
-               if ($this->isImagick()) {
-                       return $this->scaleDown($dest_width, $dest_height);
-               }
-
-               $dest = imagecreatetruecolor($dest_width, $dest_height);
-               imagealphablending($dest, false);
-               imagesavealpha($dest, true);
-               if ($this->type=='image/png') {
-                       imagefill($dest, 0, 0, imagecolorallocatealpha($dest, 0, 0, 0, 127)); // fill with alpha
-               }
-               imagecopyresampled($dest, $this->image, 0, 0, 0, 0, $dest_width, $dest_height, $width, $height);
-               if ($this->image) {
-                       imagedestroy($this->image);
-               }
-               $this->image = $dest;
-               $this->width  = imagesx($this->image);
-               $this->height = imagesy($this->image);
+               return $this->scale($dest_width, $dest_height);
        }
 
        /**
@@ -591,27 +540,59 @@ class Image
                        return false;
                }
 
+               return $this->scale($dim, $dim);
+       }
+
+       /**
+        * @brief Scale image to target dimensions
+        *
+        * @param int $dest_width
+        * @param int $dest_height
+        * @return boolean
+        */
+       private function scale($dest_width, $dest_height)
+       {
+               if (!$this->isValid()) {
+                       return false;
+               }
+
                if ($this->isImagick()) {
+                       /*
+                        * If it is not animated, there will be only one iteration here,
+                        * so don't bother checking
+                        */
+                       // Don't forget to go back to the first frame
                        $this->image->setFirstIterator();
                        do {
-                               $this->image->scaleDown($dim, $dim);
+                               // FIXME - implement horizontal bias for scaling as in following GD functions
+                               // to allow very tall images to be constrained only horizontally.
+                               $this->image->scaleImage($dest_width, $dest_height);
                        } while ($this->image->nextImage());
-                       return;
-               }
 
-               $dest = imagecreatetruecolor($dim, $dim);
-               imagealphablending($dest, false);
-               imagesavealpha($dest, true);
-               if ($this->type=='image/png') {
-                       imagefill($dest, 0, 0, imagecolorallocatealpha($dest, 0, 0, 0, 127)); // fill with alpha
-               }
-               imagecopyresampled($dest, $this->image, 0, 0, 0, 0, $dim, $dim, $this->width, $this->height);
-               if ($this->image) {
-                       imagedestroy($this->image);
+                       // These may not be necessary anymore
+                       $this->width  = $this->image->getImageWidth();
+                       $this->height = $this->image->getImageHeight();
+               } else {
+                       $dest = imagecreatetruecolor($dest_width, $dest_height);
+                       imagealphablending($dest, false);
+                       imagesavealpha($dest, true);
+
+                       if ($this->type=='image/png') {
+                               imagefill($dest, 0, 0, imagecolorallocatealpha($dest, 0, 0, 0, 127)); // fill with alpha
+                       }
+
+                       imagecopyresampled($dest, $this->image, 0, 0, 0, 0, $dest_width, $dest_height, $this->width, $this->height);
+
+                       if ($this->image) {
+                               imagedestroy($this->image);
+                       }
+
+                       $this->image = $dest;
+                       $this->width  = imagesx($this->image);
+                       $this->height = imagesy($this->image);
                }
-               $this->image = $dest;
-               $this->width  = imagesx($this->image);
-               $this->height = imagesy($this->image);
+
+               return true;
        }
 
        /**
@@ -747,7 +728,7 @@ class Image
                $type = null;
                if ($fromcurl) {
                        $a = get_app();
-                       $headers=array();
+                       $headers=[];
                        $h = explode("\n", $a->get_curl_headers());
                        foreach ($h as $l) {
                                list($k,$v) = array_map("trim", explode(":", trim($l), 2));
@@ -788,12 +769,16 @@ class Image
         */
        public static function getInfoFromURL($url)
        {
-               $data = array();
+               $data = [];
+
+               if (empty($url)) {
+                       return $data;
+               }
 
                $data = Cache::get($url);
 
                if (is_null($data) || !$data || !is_array($data)) {
-                       $img_str = fetch_url($url, true, $redirects, 4);
+                       $img_str = Network::fetchUrl($url, true, $redirects, 4);
                        $filesize = strlen($img_str);
 
                        if (function_exists("getimagesizefromstring")) {
@@ -871,7 +856,7 @@ class Image
                                }
                        }
                }
-               return array("width" => $dest_width, "height" => $dest_height);
+               return ["width" => $dest_width, "height" => $dest_height];
        }
 
        /**
@@ -892,7 +877,7 @@ class Image
 
                if (!DBM::is_result($r)) {
                        logger("Can't detect user data for uid ".$uid, LOGGER_DEBUG);
-                       return(array());
+                       return([]);
                }
 
                $page_owner_nick  = $r[0]['nickname'];
@@ -903,7 +888,7 @@ class Image
 
                if ((strlen($imagedata) == 0) && ($url == "")) {
                        logger("No image data and no url provided", LOGGER_DEBUG);
-                       return(array());
+                       return([]);
                } elseif (strlen($imagedata) == 0) {
                        logger("Uploading picture from ".$url, LOGGER_DEBUG);
 
@@ -916,7 +901,7 @@ class Image
 
                if (($maximagesize) && (strlen($imagedata) > $maximagesize)) {
                        logger("Image exceeds size limit of ".$maximagesize, LOGGER_DEBUG);
-                       return(array());
+                       return([]);
                }
 
                $tempfile = tempnam(get_temppath(), "cache");
@@ -930,7 +915,7 @@ class Image
                if (!isset($data["mime"])) {
                        unlink($tempfile);
                        logger("File is no picture", LOGGER_DEBUG);
-                       return(array());
+                       return([]);
                }
 
                $Image = new Image($imagedata, $data["mime"]);
@@ -938,7 +923,7 @@ class Image
                if (!$Image->isValid()) {
                        unlink($tempfile);
                        logger("Picture is no valid picture", LOGGER_DEBUG);
-                       return(array());
+                       return([]);
                }
 
                $Image->orient($tempfile);
@@ -956,7 +941,7 @@ class Image
                $width = $Image->getWidth();
                $height = $Image->getHeight();
 
-               $hash = photo_new_resource();
+               $hash = Photo::newResource();
 
                $smallest = 0;
 
@@ -965,15 +950,15 @@ class Image
                $defperm = "";
                $visitor = 0;
 
-               $r = Photo::store($Image, $uid, $visitor, $hash, $tempfile, t('Wall Photos'), 0, 0, $defperm);
+               $r = Photo::store($Image, $uid, $visitor, $hash, $tempfile, L10n::t('Wall Photos'), 0, 0, $defperm);
 
                if (!$r) {
                        logger("Picture couldn't be stored", LOGGER_DEBUG);
-                       return(array());
+                       return([]);
                }
 
-               $image = array("page" => System::baseUrl().'/photos/'.$page_owner_nick.'/image/'.$hash,
-                       "full" => System::baseUrl()."/photo/{$hash}-0.".$Image->getExt());
+               $image = ["page" => System::baseUrl().'/photos/'.$page_owner_nick.'/image/'.$hash,
+                       "full" => System::baseUrl()."/photo/{$hash}-0.".$Image->getExt()];
 
                if ($width > 800 || $height > 800) {
                        $image["large"] = System::baseUrl()."/photo/{$hash}-0.".$Image->getExt();
@@ -981,7 +966,7 @@ class Image
 
                if ($width > 640 || $height > 640) {
                        $Image->scaleDown(640);
-                       $r = Photo::store($Image, $uid, $visitor, $hash, $tempfile, t('Wall Photos'), 1, 0, $defperm);
+                       $r = Photo::store($Image, $uid, $visitor, $hash, $tempfile, L10n::t('Wall Photos'), 1, 0, $defperm);
                        if ($r) {
                                $image["medium"] = System::baseUrl()."/photo/{$hash}-1.".$Image->getExt();
                        }
@@ -989,7 +974,7 @@ class Image
 
                if ($width > 320 || $height > 320) {
                        $Image->scaleDown(320);
-                       $r = Photo::store($Image, $uid, $visitor, $hash, $tempfile, t('Wall Photos'), 2, 0, $defperm);
+                       $r = Photo::store($Image, $uid, $visitor, $hash, $tempfile, L10n::t('Wall Photos'), 2, 0, $defperm);
                        if ($r) {
                                $image["small"] = System::baseUrl()."/photo/{$hash}-2.".$Image->getExt();
                        }
@@ -1014,7 +999,7 @@ class Image
                        $min = 160;
                        $Image->crop(160, $x, $y, $min, $min);
 
-                       $r = Photo::store($Image, $uid, $visitor, $hash, $tempfile, t('Wall Photos'), 3, 0, $defperm);
+                       $r = Photo::store($Image, $uid, $visitor, $hash, $tempfile, L10n::t('Wall Photos'), 3, 0, $defperm);
                        if ($r) {
                                $image["thumb"] = System::baseUrl()."/photo/{$hash}-3.".$Image->getExt();
                        }