<?php
/**
- * @copyright Copyright (C) 2010-2021, the Friendica project
+ * @copyright Copyright (C) 2010-2022, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
/**
* Constructor
- * @param string $data
- * @param boolean $type optional, default null
+ *
+ * @param string $data Image data
+ * @param string $type optional, default null
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
- public function __construct($data, $type = null)
+ public function __construct(string $data, string $type = null)
{
$this->imagick = class_exists('Imagick');
$this->types = Images::supportedTypes();
$this->type = $type;
if ($this->isImagick() && $this->loadData($data)) {
- return true;
+ return;
} else {
// Failed to load with Imagick, fallback
$this->imagick = false;
}
- return $this->loadData($data);
+ $this->loadData($data);
}
/**
}
/**
- * @param string $data data
- * @return boolean
+ * Loads image data into handler class
+ *
+ * @param string $data Image data
+ * @return boolean Success
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
- private function loadData($data)
+ private function loadData(string $data): bool
{
if ($this->isImagick()) {
$this->image = new Imagick();
* setup the compression here, so we'll do it only once
*/
switch ($this->getType()) {
- case "image/png":
+ case 'image/png':
$quality = DI::config()->get('system', 'png_quality');
- if ((! $quality) || ($quality > 9)) {
- $quality = PNG_QUALITY;
- }
/*
* From http://www.imagemagick.org/script/command-line-options.php#quality:
*
$quality = $quality * 10;
$this->image->setCompressionQuality($quality);
break;
- case "image/jpeg":
+
+ case 'image/jpg':
+ case 'image/jpeg':
$quality = DI::config()->get('system', 'jpeg_quality');
- if ((! $quality) || ($quality > 100)) {
- $quality = JPEG_QUALITY;
- }
$this->image->setCompressionQuality($quality);
}
}
$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;
+ try {
+ $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;
+ }
+ } catch (\Throwable $error) {
+ /** @see https://github.com/php/doc-en/commit/d09a881a8e9059d11e756ee59d75bf404d6941ed */
+ if (strstr($error->getMessage(), "gd-webp cannot allocate temporary buffer")) {
+ DI::logger()->notice('Image is probably animated and therefore unsupported', ['error' => $error]);
+ } else {
+ DI::logger()->warning('Unexpected throwable.', ['error' => $error]);
+ }
}
return false;
/**
* @return boolean
*/
- public function isValid()
+ public function isValid(): bool
{
if ($this->isImagick()) {
return ($this->image !== false);
}
/**
+ * Scales image down
+ *
* @param integer $max max dimension
* @return mixed
*/
- public function scaleDown($max)
+ public function scaleDown(int $max)
{
if (!$this->isValid()) {
return false;
}
/**
+ * Rotates image
+ *
* @param integer $degrees degrees to rotate image
* @return mixed
*/
- public function rotate($degrees)
+ public function rotate(int $degrees)
{
if (!$this->isValid()) {
return false;
}
/**
+ * Flips image
+ *
* @param boolean $horiz optional, default true
* @param boolean $vert optional, default false
* @return mixed
*/
- public function flip($horiz = true, $vert = false)
+ public function flip(bool $horiz = true, bool $vert = false)
{
if (!$this->isValid()) {
return false;
}
/**
- * @param string $filename filename
+ * Fixes orientation and maybe returns EXIF data (?)
+ *
+ * @param string $filename Filename
* @return mixed
*/
- public function orient($filename)
+ public function orient(string $filename)
{
if ($this->isImagick()) {
// based off comment on http://php.net/manual/en/imagick.getimageorientation.php
}
/**
- * @param integer $min minimum dimension
+ * Rescales image to minimum size
+ *
+ * @param integer $min Minimum dimension
* @return mixed
*/
- public function scaleUp($min)
+ public function scaleUp(int $min)
{
if (!$this->isValid()) {
return false;
}
/**
- * @param integer $dim dimension
+ * Scales image to square
+ *
+ * @param integer $dim Dimension
* @return mixed
*/
- public function scaleToSquare($dim)
+ public function scaleToSquare(int $dim)
{
if (!$this->isValid()) {
return false;
/**
* Scale image to target dimensions
*
- * @param int $dest_width
- * @param int $dest_height
- * @return boolean
+ * @param int $dest_width Destination width
+ * @param int $dest_height Destination height
+ * @return boolean Success
*/
- private function scale($dest_width, $dest_height)
+ private function scale(int $dest_width, int $dest_height): bool
{
if (!$this->isValid()) {
return false;
/**
* Convert a GIF to a PNG to make it static
+ *
+ * @return void
*/
public function toStatic()
{
}
/**
+ * Crops image
+ *
* @param integer $max maximum
* @param integer $x x coordinate
* @param integer $y y coordinate
* @param integer $h height
* @return mixed
*/
- public function crop($max, $x, $y, $w, $h)
+ public function crop(int $max, int $x, int $y, int $w, int $h)
{
if (!$this->isValid()) {
return false;
$this->image = $dest;
$this->width = imagesx($this->image);
$this->height = imagesy($this->image);
- }
- /**
- * @param string $path file path
- * @return mixed
- * @throws \Friendica\Network\HTTPException\InternalServerErrorException
- */
- public function saveToFilePath($path)
- {
- if (!$this->isValid()) {
- return false;
- }
-
- $string = $this->asString();
-
- DI::profiler()->stopRecording('file');
- file_put_contents($path, $string);
- DI::profiler()->stopRecording();
+ // All successful
+ return true;
}
/**
* @return string
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
- public function __toString() {
- return $this->asString();
+ public function __toString(): string
+ {
+ return (string) $this->asString();
}
/**
+ * Returns image as string or false on failure
+ *
* @return mixed
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
imageinterlace($this->image, true);
switch ($this->getType()) {
- case "image/png":
+ case 'image/png':
$quality = DI::config()->get('system', 'png_quality');
- if ((!$quality) || ($quality > 9)) {
- $quality = PNG_QUALITY;
- }
imagepng($this->image, null, $quality);
break;
- case "image/jpeg":
+
+ case 'image/jpeg':
+ case 'image/jpg':
$quality = DI::config()->get('system', 'jpeg_quality');
- if ((!$quality) || ($quality > 100)) {
- $quality = JPEG_QUALITY;
- }
imagejpeg($this->image, null, $quality);
+ break;
}
$string = ob_get_contents();
ob_end_clean();
return $string;
}
-
- /**
- * supported mimetypes and corresponding file extensions
- *
- * @return array
- * @deprecated in version 2019.12 please use Util\Images::supportedTypes() instead.
- */
- public static function supportedTypes()
- {
- return Images::supportedTypes();
- }
-
- /**
- * Maps Mime types to Imagick formats
- *
- * @return array With with image formats (mime type as key)
- * @deprecated in version 2019.12 please use Util\Images::getFormatsMap() instead.
- */
- public static function getFormatsMap()
- {
- return Images::getFormatsMap();
- }
-
- /**
- * @param string $url url
- * @return array
- * @throws \Friendica\Network\HTTPException\InternalServerErrorException
- * @deprecated in version 2019.12 please use Util\Images::getInfoFromURLCached() instead.
- */
- public static function getInfoFromURL($url)
- {
- return Images::getInfoFromURLCached($url);
- }
-
- /**
- * @param integer $width width
- * @param integer $height height
- * @param integer $max max
- * @return array
- * @deprecated in version 2019.12 please use Util\Images::getScalingDimensions() instead.
- */
- public static function getScalingDimensions($width, $height, $max)
- {
- return Images::getScalingDimensions($width, $height, $max);
- }
}