%PDF- %PDF-
Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Helper/Image/ |
Current File : //www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Helper/Image/ImagickHelper.php |
<?php /** * This file is part of the Passwords App * created by Marius David Wieschollek * and licensed under the AGPL. */ namespace OCA\Passwords\Helper\Image; use Gmagick; use GmagickException; use Imagick; use OCA\Passwords\Exception\Image\ImageConversionException; use OCA\Passwords\Exception\Image\ImageExportException; use Throwable; /** * Class ImagickHelper * * @package OCA\Passwords\Helper\Image */ class ImagickHelper extends AbstractImageHelper { /** * @param Imagick|Gmagick $image * @param int $minWidth * @param int $minHeight * @param int $maxWidth * @param int $maxHeight * * @return Imagick|Gmagick * @throws GmagickException */ public function advancedResizeImage($image, int $minWidth, int $minHeight, int $maxWidth, int $maxHeight) { $size = $this->getBestImageFit($image->getImageWidth(), $image->getImageHeight(), $minWidth, $minHeight, $maxWidth, $maxHeight); $image->resizeImage($size['width'], $size['height'], $image::FILTER_LANCZOS, 1); if($size['cropNeeded']) { $image->cropImage($size['cropWidth'], $size['cropHeight'], $size['cropX'], $size['cropY']); } return $image; } /** * @param Imagick|Gmagick $image * @param int $size * * @return Imagick|Gmagick * @throws GmagickException */ public function simpleResizeImage($image, int $size) { $image->resizeImage($size, $size, $image::FILTER_LANCZOS, 1, 1); return $image; } /** * @param Imagick|Gmagick $image * * @return Imagick|Gmagick * @throws GmagickException */ public function cropImageRectangular($image) { $width = $image->getImageWidth(); $height = $image->getImageHeight(); if($width > $height) { $padding = ($width - $height) / 2; $image->cropImage($height, $height, $padding, 0); } if($width < $height) { $padding = ($height - $width) / 2; $image->cropImage($width, $width, 0, $padding); } return $image; } /** * @param $imageBlob * * @return Imagick|Gmagick * @throws Throwable */ public function getImageFromBlob($imageBlob) { $size = getimagesizefromstring($imageBlob); if($size && in_array($size['mime'], ['image/icon', 'image/vnd.microsoft.icon'])) { $imageBlob = $this->convertIcoToPng($imageBlob); } $image = $this->getNewImageObject(); $image->readImageBlob($imageBlob); $image->stripImage(); return $image; } /** * @param Imagick|Gmagick $image * * @return bool * @throws GmagickException */ public function destroyImage($image): bool { $image->clear(); return $image->destroy(); } /** * @param Imagick|Gmagick $image * * @return string * @throws ImageExportException */ public function exportJpeg($image): string { try { $image->setImageFormat('jpg'); $image->setImageCompression($image::COMPRESSION_JPEG); if($image instanceof Imagick) $image->setImageCompressionQuality(90); $image->setCompressionQuality(100); $image->stripImage(); return $image->getImageBlob(); } catch(\Throwable $e) { throw new ImageExportException('jpg', $e); } } /** * @param Imagick|Gmagick $image * * @return string * @throws ImageExportException */ public function exportPng($image): string { try { $image->setImageFormat('png'); if($image instanceof Imagick) $image->setImageCompressionQuality(9); $image->setCompressionQuality(100); $image->stripImage(); return $image->getImageBlob(); } catch(\Throwable $e) { throw new ImageExportException('png', $e); } } /** * @param string $format * * @return bool * @throws GmagickException */ public function supportsFormat(string $format): bool { $image = $this->getNewImageObject(); if($format === 'vnd.microsoft.icon') { $format = 'icon'; } else if($format === 'x-bmp') { $format = 'bmp'; } else if($format === 'svg+xml') $format = 'svg'; $format = strtoupper($format); return !empty($image->queryFormats($format)); } /** * @param string $data * * @return string * @throws ImageConversionException */ public function convertIcoToPng($data): string { $tempFile = $this->config->getTempDir().uniqid().'.ico'; try { file_put_contents($tempFile, $data); $image = $this->getNewImageObject(); $image->readImage($tempFile); $image->setImageFormat('png'); $content = $image->getImageBlob(); $image->destroy(); unlink($tempFile); } catch(Throwable $e) { if(is_file($tempFile)) @unlink($tempFile); throw new ImageConversionException($e); } return $content; } /** * @return Imagick|Gmagick */ protected function getNewImageObject(): Imagick|Gmagick { return class_exists(Imagick::class) ? new Imagick():new Gmagick(); } /** * @inheritdoc */ public function isAvailable(): bool { return class_exists(Imagick::class) || class_exists(Gmagick::class); } }