You are here

protected function SmartCrop::execute in Image Effects 8

Same name in this branch
  1. 8 src/Plugin/ImageToolkit/Operation/gd/SmartCrop.php \Drupal\image_effects\Plugin\ImageToolkit\Operation\gd\SmartCrop::execute()
  2. 8 src/Plugin/ImageToolkit/Operation/imagemagick/SmartCrop.php \Drupal\image_effects\Plugin\ImageToolkit\Operation\imagemagick\SmartCrop::execute()
Same name and namespace in other branches
  1. 8.3 src/Plugin/ImageToolkit/Operation/imagemagick/SmartCrop.php \Drupal\image_effects\Plugin\ImageToolkit\Operation\imagemagick\SmartCrop::execute()
  2. 8.2 src/Plugin/ImageToolkit/Operation/imagemagick/SmartCrop.php \Drupal\image_effects\Plugin\ImageToolkit\Operation\imagemagick\SmartCrop::execute()

File

src/Plugin/ImageToolkit/Operation/imagemagick/SmartCrop.php, line 28

Class

SmartCrop
Defines Imagemagick Scale and Smart Crop operation.

Namespace

Drupal\image_effects\Plugin\ImageToolkit\Operation\imagemagick

Code

protected function execute(array $arguments = []) {
  $file_system = \Drupal::service('file_system');
  $image_factory = \Drupal::service('image.factory');

  // Convert the image to disk at the current state, and reopen it using the
  // GD toolkit to allow determining the crop rectangle.
  $temp_path = $file_system
    ->tempnam('temporary://', 'image_effects_');
  $current_destination_format = $this
    ->getToolkit()
    ->arguments()
    ->getDestinationFormat();
  $this
    ->getToolkit()
    ->arguments()
    ->setDestinationFormatFromExtension('png');
  $this
    ->getToolkit()
    ->save($temp_path);
  $this
    ->getToolkit()
    ->arguments()
    ->setDestinationFormat($current_destination_format);
  $temp_image = $image_factory
    ->get($temp_path, 'gd');
  switch ($arguments['algorithm']) {
    case 'entropy_slice':
      $rect = $this
        ->getEntropyCropBySlicing($temp_image
        ->getToolkit()
        ->getResource(), $arguments['width'], $arguments['height']);
      break;
    case 'entropy_grid':
      $rect = $this
        ->getEntropyCropByGridding($temp_image
        ->getToolkit()
        ->getResource(), $arguments['width'], $arguments['height'], $arguments['simulate'], $arguments['algorithm_params']['grid_width'], $arguments['algorithm_params']['grid_height'], $arguments['algorithm_params']['grid_rows'], $arguments['algorithm_params']['grid_cols'], $arguments['algorithm_params']['grid_sub_rows'], $arguments['algorithm_params']['grid_sub_cols']);
      break;
  }
  $points = $this
    ->getRectangleCorners($rect);

  // Do not need the temporary image file any longer.
  $file_system
    ->unlink($temp_path);

  // Crop the image using the coordinates found above. If simulating, draw
  // a marker on the image instead.
  if (!$arguments['simulate']) {
    return $this
      ->getToolkit()
      ->apply('crop', [
      'x' => $points[6],
      'y' => $points[7],
      'width' => $rect
        ->getWidth(),
      'height' => $rect
        ->getHeight(),
    ]);
  }
  else {
    $rect
      ->translate([
      -2,
      -2,
    ]);
    for ($i = -2; $i <= 2; $i++) {
      $this
        ->getToolkit()
        ->apply('draw_rectangle', [
        'rectangle' => $rect,
        'border_color' => $i !== 0 ? '#00FF00FF' : '#FF0000FF',
      ]);
      $rect
        ->translate([
        1,
        1,
      ]);
    }
    for ($i = 0; $i < 8; $i += 2) {
      $this
        ->getToolkit()
        ->apply('draw_ellipse', [
        'cx' => $points[$i],
        'cy' => $points[$i + 1],
        'width' => 6,
        'height' => 6,
        'color' => '#FF0000FF',
      ]);
    }
  }
  return TRUE;
}