photo = $photo; $this->album = $photo->album; $this->albumSource = $this->album->getAlbumSource(); $this->imageHelper = new ImageHelper(); $this->themeHelper = new ThemeHelper(); } public function analyse() { /** @var Album $album */ $album = $this->photo->album; $albumSource = $album->getAlbumSource(); $photoFile = $albumSource->getPathToPhoto($this->photo); $imageInfo = null; $originalPhotoResource = $this->imageHelper->openImage($photoFile, $imageInfo); if ($originalPhotoResource === false) { throw new \Exception(sprintf('The image "%s" does not appear to be a valid image, or cannot be read', pathinfo($photoFile, PATHINFO_FILENAME))); } $this->photo->width = $imageInfo[0]; $this->photo->height = $imageInfo[1]; $this->photo->mime_type = $imageInfo['mime']; // Read the Exif data $exifData = @exif_read_data($photoFile); $isExifDataFound = ($exifData !== false && is_array($exifData)); $angleToRotate = 0; // If Exif data contains an Orientation, ensure we rotate the original image as such if ($isExifDataFound && isset($exifData['Orientation'])) { switch ($exifData['Orientation']) { case 3: $angleToRotate = 180; break; case 6: $angleToRotate = 270; break; case 8: $angleToRotate = 90; break; } if ($angleToRotate > 0) { $originalPhotoResource = $this->imageHelper->rotateImage($originalPhotoResource, $angleToRotate); if ($angleToRotate == 90 || $angleToRotate == 270) { $this->photo->width = $imageInfo[1]; $this->photo->height = $imageInfo[0]; } $this->imageHelper->saveImage($originalPhotoResource, $photoFile, $imageInfo); } } if ($isExifDataFound) { $this->photo->metadata_version = self::METADATA_VERSION; $this->photo->taken_at = $this->metadataDateTime($exifData); $this->photo->camera_make = $this->metadataCameraMake($exifData); $this->photo->camera_model = $this->metadataCameraModel($exifData); $this->photo->camera_software = $this->metadataCameraSoftware($exifData); } $this->photo->is_analysed = true; $this->photo->save(); $this->regenerateThumbnails($originalPhotoResource); } public function regenerateThumbnails($originalPhotoResource = null) { if (is_null($originalPhotoResource)) { $imageInfo = null; $originalPhotoResource = $this->imageHelper->openImage($this->albumSource->getPathToPhoto($this->photo), $imageInfo); } // Generate and save thumbnails $themeInfo = $this->themeHelper->info(); $thumbnailsRequired = $themeInfo['thumbnails']; /** @var mixed $thumbnail */ foreach ($thumbnailsRequired as $thumbnail) { $generatedThumbnailPath = $this->imageHelper->generateThumbnail($originalPhotoResource, $this->photo, $thumbnail); $this->albumSource->saveThumbnail($this->photo, $thumbnail, $generatedThumbnailPath); } } public function rotate($angle) { $imageInfo = array(); $photoPath = $this->albumSource->getPathToPhoto($this->photo); $originalPhotoImage = $this->imageHelper->openImage($photoPath, $imageInfo); $originalPhotoImage = $this->imageHelper->rotateImage($originalPhotoImage, intval($angle)); $this->imageHelper->saveImage($originalPhotoImage, $photoPath, $imageInfo); if ($angle == 90 || $angle == 270) { $width = $this->photo->width; $this->photo->width = $this->photo->height; $this->photo->height = $width; } $this->regenerateThumbnails($originalPhotoImage); $this->photo->save(); } private function metadataCameraMake(array $exifData) { if (isset($exifData['Make'])) { return $exifData['Make']; } return null; } private function metadataCameraModel(array $exifData) { if (isset($exifData['Model'])) { return $exifData['Model']; } return null; } private function metadataCameraSoftware(array $exifData) { if (isset($exifData['Software'])) { return $exifData['Software']; } return null; } private function metadataDateTime(array $exifData) { $dateTime = null; if (isset($exifData['DateTime'])) { $dateTime = $exifData['DateTime']; } if (!is_null($dateTime)) { $dateTime = preg_replace('/^([\d]{4}):([\d]{2}):([\d]{2})/', '$1-$2-$3', $dateTime); } return $dateTime; } }