You are here

function simple_image_rotate_rotate_image in Simple Image Rotate 2.0.x

Same name and namespace in other branches
  1. 8 simple_image_rotate.module \simple_image_rotate_rotate_image()
  2. 7.2 simple_image_rotate.module \simple_image_rotate_rotate_image()
  3. 7 simple_image_rotate.module \simple_image_rotate_rotate_image()
  4. 2.1.x simple_image_rotate.module \simple_image_rotate_rotate_image()
  5. 1.0.x simple_image_rotate.module \simple_image_rotate_rotate_image()

Rotates image.

1 call to simple_image_rotate_rotate_image()
simple_image_rotate_entity_presave in ./simple_image_rotate.module
Implements hook_entity_presave().

File

./simple_image_rotate.module, line 145
This is the Simple Image Rotate module for rotating uploaded image files.

Code

function simple_image_rotate_rotate_image(EntityInterface &$entity) {
  $type = $entity
    ->getEntityType()
    ->id();
  $bundle = $entity
    ->bundle();
  $entityManager = \Drupal::service('entity_field.manager');
  $fields = $entityManager
    ->getFieldDefinitions($type, $bundle);
  foreach ($fields as $field_name => $field) {
    if ($field
      ->getType() == "image") {
      if (!$field instanceof ThirdPartySettingsInterface) {
        continue;
      }
      if ($field
        ->getThirdPartySetting('simple_image_rotate', 'enable_rotate') == 1) {
        $instances = $entity
          ->get($field_name);
        foreach ($instances as $delta => $instance) {

          // If rotate angle is indicated.
          $values = $instance
            ->getValue();
          if (isset($values["rotate"]) && $values["rotate"]) {

            // Load image file.
            $fid = $values["target_id"];
            $file = File::load($fid);

            // Get a new filename with '_r[counter]' suffix.
            if (preg_match('#_r([\\d]+)\\.[^.]+$#i', $file
              ->getFileUri(), $matches)) {
              $file_counter = $matches[1];
              $new_uri = $file
                ->getFileUri();
            }
            else {
              $file_counter = 1;
              $pos = strrpos($file
                ->getFileUri(), '.');
              $new_uri = substr_replace($file
                ->getFileUri(), '_r' . $file_counter, $pos, 0);
            }

            // Increment filename counter if filename is occupied.
            while (file_exists($new_uri)) {
              $find = '_r' . $file_counter;
              $file_counter++;
              $replace = '_r' . $file_counter;
              $new_uri = str_replace($find, $replace, $new_uri);
            }

            // Move image file to a new location.
            if (file_move($file, $new_uri, 'FILE_EXIST_ERROR')) {

              // Update file object after moving file.
              $file = File::load($fid);

              // Rotate image and save image object.
              $image = \Drupal::service('image.factory')
                ->get($file
                ->getFileUri());
              try {
                $image
                  ->rotate($values['rotate']);
                if ($image
                  ->save()) {

                  // Reload image to get new width, height and filesize.
                  $image = \Drupal::service('image.factory')
                    ->get($file
                    ->getFileUri());

                  // Update image width and height in entity.
                  $instance
                    ->set("width", $image
                    ->getWidth());
                  $instance
                    ->set("height", $image
                    ->getHeight());

                  // Update file.
                  $file
                    ->setSize($image
                    ->getFileSize());
                  $file
                    ->save();
                }
              } catch (Exception $ex) {
                \Drupal::logger('simple_image_rotate')
                  ->notice(t('Problem rotating image: @message', array(
                  '@message' => $ex
                    ->getMessage(),
                )));
              }
            }
          }
        }
      }
    }
  }
}