Przeglądaj źródła

Update Image Util

Daniel Supernault 5 lat temu
rodzic
commit
7355e94723
1 zmienionych plików z 187 dodań i 153 usunięć
  1. 187 153
      app/Util/Media/Image.php

+ 187 - 153
app/Util/Media/Image.php

@@ -8,157 +8,191 @@ use Cache, Storage;
 
 class Image
 {
-    public $square;
-    public $landscape;
-    public $portrait;
-    public $thumbnail;
-    public $orientation;
-    public $acceptedMimes = [
-        'image/png',
-        'image/jpeg'
-    ];
-
-    public function __construct()
-    {
-        ini_set('memory_limit', config('pixelfed.memory_limit', '1024M'));
-
-        $this->square = $this->orientations()['square'];
-        $this->landscape = $this->orientations()['landscape'];
-        $this->portrait = $this->orientations()['portrait'];
-        $this->thumbnail = [
-          'width'  => 640,
-          'height' => 640,
-        ];
-        $this->orientation = null;
-    }
-
-    public function orientations()
-    {
-        return [
-          'square' => [
-            'width'  => 1080,
-            'height' => 1080,
-          ],
-          'landscape' => [
-            'width'  => 1920,
-            'height' => 1080,
-          ],
-          'portrait' => [
-            'width'  => 1080,
-            'height' => 1350,
-          ],
-    ];
-    }
-
-    public function getAspectRatio($mediaPath, $thumbnail = false)
-    {
-        if (!is_file($mediaPath)) {
-            throw new \Exception('Invalid Media Path');
-        }
-        if ($thumbnail) {
-            return [
-                'dimensions'  => $this->thumbnail,
-                'orientation' => 'thumbnail',
-            ];
-        }
-
-        list($width, $height) = getimagesize($mediaPath);
-        $aspect = $width / $height;
-        $orientation = $aspect === 1 ? 'square' :
-        ($aspect > 1 ? 'landscape' : 'portrait');
-        $this->orientation = $orientation;
-
-        return [
-          'dimensions'  => $this->orientations()[$orientation],
-          'orientation' => $orientation,
-      ];
-    }
-
-    public function resizeImage(Media $media)
-    {
-        $basePath = storage_path('app/'.$media->media_path);
-
-        $this->handleResizeImage($media);
-    }
-
-    public function resizeThumbnail(Media $media)
-    {
-        $basePath = storage_path('app/'.$media->media_path);
-
-        $this->handleThumbnailImage($media);
-    }
-
-    public function handleResizeImage(Media $media)
-    {
-        $this->handleImageTransform($media, false);
-    }
-
-    public function handleThumbnailImage(Media $media)
-    {
-        $this->handleImageTransform($media, true);
-    }
-
-    public function handleImageTransform(Media $media, $thumbnail = false)
-    {
-        $path = $media->media_path;
-        $file = storage_path('app/'.$path);
-        if (!in_array($media->mime, $this->acceptedMimes)) {
-            return;
-        }
-        $ratio = $this->getAspectRatio($file, $thumbnail);
-        $aspect = $ratio['dimensions'];
-        $orientation = $ratio['orientation'];
-
-        try {
-            $img = Intervention::make($file);
-            $metadata = $img->exif();
-            $img->orientate();
-            if($thumbnail) {
-                $img->resize($aspect['width'], $aspect['height'], function ($constraint) {
-                    $constraint->aspectRatio();
-                });
-            } else {
-                if(config('media.exif.database', false) == true) {
-                    $media->metadata = json_encode($metadata);
-                }
-
-                $img->resize($aspect['width'], $aspect['height'], function ($constraint) {
-                    $constraint->aspectRatio();
-                });
-            }
-            $converted = $this->setBaseName($path, $thumbnail, $img->extension);
-            $newPath = storage_path('app/'.$converted['path']);
-
-            $quality = config('pixelfed.image_quality');
-            $img->save($newPath, $quality);
-            $img->destroy();
-            if (!$thumbnail) {
-                $media->orientation = $orientation;
-            }
-
-            if ($thumbnail == true) {
-                $media->thumbnail_path = $converted['path'];
-                $media->thumbnail_url = url(Storage::url($converted['path']));
-            } else {
-                $media->media_path = $converted['path'];
-                $media->mime = $img->mime;
-            }
-
-            $media->save();
-            Cache::forget('status:transformer:media:attachments:'.$media->status_id);
-            Cache::forget('status:thumb:'.$media->status_id);
-        } catch (Exception $e) {
-        }
-    }
-
-    public function setBaseName($basePath, $thumbnail, $extension)
-    {
-        $png = false;
-        $path = explode('.', $basePath);
-        $name = ($thumbnail == true) ? $path[0].'_thumb' : $path[0];
-        $ext = last($path);
-        $basePath = "{$name}.{$ext}";
-
-        return ['path' => $basePath, 'png' => $png];
-    }
+	public $square;
+	public $landscape;
+	public $portrait;
+	public $thumbnail;
+	public $orientation;
+	public $acceptedMimes = [
+		'image/png',
+		'image/jpeg'
+	];
+
+	public function __construct()
+	{
+		ini_set('memory_limit', config('pixelfed.memory_limit', '1024M'));
+
+		$this->square = $this->orientations()['square'];
+		$this->landscape = $this->orientations()['landscape'];
+		$this->portrait = $this->orientations()['portrait'];
+		$this->thumbnail = [
+			'width'  => 640,
+			'height' => 640,
+		];
+		$this->orientation = null;
+	}
+
+	public function orientations()
+	{
+		return [
+			'square' => [
+				'width'  => 1080,
+				'height' => 1080,
+			],
+			'landscape' => [
+				'width'  => 1920,
+				'height' => 1080,
+			],
+			'portrait' => [
+				'width'  => 1080,
+				'height' => 1350,
+			],
+		];
+	}
+
+	public function getAspectRatio($mediaPath, $thumbnail = false)
+	{
+		if (!is_file($mediaPath)) {
+			throw new \Exception('Invalid Media Path');
+		}
+		if ($thumbnail) {
+			return [
+				'dimensions'  => $this->thumbnail,
+				'orientation' => 'thumbnail',
+			];
+		}
+
+		list($width, $height) = getimagesize($mediaPath);
+		$aspect = $width / $height;
+		$orientation = $aspect === 1 ? 'square' :
+		($aspect > 1 ? 'landscape' : 'portrait');
+		$this->orientation = $orientation;
+
+		return [
+			'dimensions'  => $this->orientations()[$orientation],
+			'orientation' => $orientation,
+		];
+	}
+
+	public function resizeImage(Media $media)
+	{
+		$basePath = storage_path('app/'.$media->media_path);
+
+		$this->handleResizeImage($media);
+	}
+
+	public function resizeThumbnail(Media $media)
+	{
+		$basePath = storage_path('app/'.$media->media_path);
+
+		$this->handleThumbnailImage($media);
+	}
+
+	public function handleResizeImage(Media $media)
+	{
+		$this->handleImageTransform($media, false);
+	}
+
+	public function handleThumbnailImage(Media $media)
+	{
+		$this->handleImageTransform($media, true);
+	}
+
+	public function handleImageTransform(Media $media, $thumbnail = false)
+	{
+		$path = $media->media_path;
+		$file = storage_path('app/'.$path);
+		if (!in_array($media->mime, $this->acceptedMimes)) {
+			return;
+		}
+		$ratio = $this->getAspectRatio($file, $thumbnail);
+		$aspect = $ratio['dimensions'];
+		$orientation = $ratio['orientation'];
+
+		try {
+			$img = Intervention::make($file);
+			$metadata = $img->exif();
+			$img->orientate();
+			if($thumbnail) {
+				$img->resize($aspect['width'], $aspect['height'], function ($constraint) {
+					$constraint->aspectRatio();
+				});
+			} else {
+				if(config('media.exif.database', false) == true) {
+					$meta = [];
+					$keys = [
+						"COMPUTED",
+						"FileName",
+						"FileSize",
+						"FileType",
+						"Make",
+						"Model",
+						"MimeType",
+						"ColorSpace",
+						"ExifVersion",
+						"Orientation",
+						"UserComment",
+						"XResolution",
+						"YResolution",
+						"FileDateTime",
+						"SectionsFound",
+						"ExifImageWidth",
+						"ResolutionUnit",
+						"ExifImageLength",
+						"FlashPixVersion",
+						"Exif_IFD_Pointer",
+						"YCbCrPositioning",
+						"ComponentsConfiguration",
+						"ExposureTime",
+						"FNumber",
+						"ISOSpeedRatings",
+						"ShutterSpeedValue"
+					];
+					foreach ($metadata as $k => $v) {
+						if(in_array($k, $keys)) {
+							$meta[$k] = $v;
+						}
+					}
+					$media->metadata = json_encode($meta);
+				} 
+
+				$img->resize($aspect['width'], $aspect['height'], function ($constraint) {
+					$constraint->aspectRatio();
+				});
+			}
+			$converted = $this->setBaseName($path, $thumbnail, $img->extension);
+			$newPath = storage_path('app/'.$converted['path']);
+
+			$quality = config('pixelfed.image_quality');
+			$img->save($newPath, $quality);
+			$img->destroy();
+			if (!$thumbnail) {
+				$media->orientation = $orientation;
+			}
+
+			if ($thumbnail == true) {
+				$media->thumbnail_path = $converted['path'];
+				$media->thumbnail_url = url(Storage::url($converted['path']));
+			} else {
+				$media->media_path = $converted['path'];
+				$media->mime = $img->mime;
+			}
+
+			$media->save();
+			Cache::forget('status:transformer:media:attachments:'.$media->status_id);
+			Cache::forget('status:thumb:'.$media->status_id);
+		} catch (Exception $e) {
+		}
+	}
+
+	public function setBaseName($basePath, $thumbnail, $extension)
+	{
+		$png = false;
+		$path = explode('.', $basePath);
+		$name = ($thumbnail == true) ? $path[0].'_thumb' : $path[0];
+		$ext = last($path);
+		$basePath = "{$name}.{$ext}";
+
+		return ['path' => $basePath, 'png' => $png];
+	}
 }