You are here

Image.php in Zircon Profile 8

Namespace

Drupal\Core\Image

File

core/lib/Drupal/Core/Image/Image.php
View source
<?php

/**
 * @file
 * Contains \Drupal\Core\Image\Image.
 */
namespace Drupal\Core\Image;

use Drupal\Core\ImageToolkit\ImageToolkitInterface;

/**
 * Defines an image object to represent an image file.
 *
 * @see \Drupal\Core\ImageToolkit\ImageToolkitInterface
 * @see \Drupal\image\ImageEffectInterface
 *
 * @ingroup image
 */
class Image implements ImageInterface {

  /**
   * Path of the image file.
   *
   * @var string
   */
  protected $source = '';

  /**
   * An image toolkit object.
   *
   * @var \Drupal\Core\ImageToolkit\ImageToolkitInterface
   */
  protected $toolkit;

  /**
   * File size in bytes.
   *
   * @var int
   */
  protected $fileSize;

  /**
   * Constructs a new Image object.
   *
   * @param \Drupal\Core\ImageToolkit\ImageToolkitInterface $toolkit
   *   The image toolkit.
   * @param string|null $source
   *   (optional) The path to an image file, or NULL to construct the object
   *   with no image source.
   */
  public function __construct(ImageToolkitInterface $toolkit, $source = NULL) {
    $this->toolkit = $toolkit;
    if ($source) {
      $this->source = $source;
      $this
        ->getToolkit()
        ->setSource($this->source);

      // Defer image file validity check to the toolkit.
      if ($this
        ->getToolkit()
        ->parseFile()) {
        $this->fileSize = filesize($this->source);
      }
    }
  }

  /**
   * {@inheritdoc}
   */
  public function isValid() {
    return $this
      ->getToolkit()
      ->isValid();
  }

  /**
   * {@inheritdoc}
   */
  public function getHeight() {
    return $this
      ->getToolkit()
      ->getHeight();
  }

  /**
   * {@inheritdoc}
   */
  public function getWidth() {
    return $this
      ->getToolkit()
      ->getWidth();
  }

  /**
   * {@inheritdoc}
   */
  public function getFileSize() {
    return $this->fileSize;
  }

  /**
   * {@inheritdoc}
   */
  public function getMimeType() {
    return $this
      ->getToolkit()
      ->getMimeType();
  }

  /**
   * {@inheritdoc}
   */
  public function getSource() {
    return $this->source;
  }

  /**
   * {@inheritdoc}
   */
  public function getToolkitId() {
    return $this
      ->getToolkit()
      ->getPluginId();
  }

  /**
   * {@inheritdoc}
   */
  public function getToolkit() {
    return $this->toolkit;
  }

  /**
   * {@inheritdoc}
   */
  public function save($destination = NULL) {

    // Return immediately if the image is not valid.
    if (!$this
      ->isValid()) {
      return FALSE;
    }
    $destination = $destination ?: $this
      ->getSource();
    if ($return = $this
      ->getToolkit()
      ->save($destination)) {

      // Clear the cached file size and refresh the image information.
      clearstatcache(TRUE, $destination);
      $this->fileSize = filesize($destination);
      $this->source = $destination;

      // @todo Use File utility when https://www.drupal.org/node/2050759 is in.
      if ($this
        ->chmod($destination)) {
        return $return;
      }
    }
    return FALSE;
  }

  /**
   * {@inheritdoc}
   */
  public function apply($operation, array $arguments = array()) {
    return $this
      ->getToolkit()
      ->apply($operation, $arguments);
  }

  /**
   * {@inheritdoc}
   */
  public function createNew($width, $height, $extension = 'png', $transparent_color = '#ffffff') {
    return $this
      ->apply('create_new', array(
      'width' => $width,
      'height' => $height,
      'extension' => $extension,
      'transparent_color' => $transparent_color,
    ));
  }

  /**
   * {@inheritdoc}
   */
  public function convert($extension) {
    return $this
      ->apply('convert', array(
      'extension' => $extension,
    ));
  }

  /**
   * {@inheritdoc}
   */
  public function crop($x, $y, $width, $height = NULL) {
    return $this
      ->apply('crop', array(
      'x' => $x,
      'y' => $y,
      'width' => $width,
      'height' => $height,
    ));
  }

  /**
   * {@inheritdoc}
   */
  public function desaturate() {
    return $this
      ->apply('desaturate', array());
  }

  /**
   * {@inheritdoc}
   */
  public function resize($width, $height) {
    return $this
      ->apply('resize', array(
      'width' => $width,
      'height' => $height,
    ));
  }

  /**
   * {@inheritdoc}
   */
  public function rotate($degrees, $background = NULL) {
    return $this
      ->apply('rotate', array(
      'degrees' => $degrees,
      'background' => $background,
    ));
  }

  /**
   * {@inheritdoc}
   */
  public function scaleAndCrop($width, $height) {
    return $this
      ->apply('scale_and_crop', array(
      'width' => $width,
      'height' => $height,
    ));
  }

  /**
   * {@inheritdoc}
   */
  public function scale($width, $height = NULL, $upscale = FALSE) {
    return $this
      ->apply('scale', array(
      'width' => $width,
      'height' => $height,
      'upscale' => $upscale,
    ));
  }

  /**
   * Provides a wrapper for drupal_chmod() to allow unit testing.
   *
   * @param string $uri
   *   A string containing a URI file, or directory path.
   * @param int $mode
   *   Integer value for the permissions. Consult PHP chmod() documentation for
   *   more information.
   *
   * @see drupal_chmod()
   *
   * @todo Remove when https://www.drupal.org/node/2050759 is in.
   *
   * @return bool
   *   TRUE for success, FALSE in the event of an error.
   */
  protected function chmod($uri, $mode = NULL) {
    return drupal_chmod($uri, $mode);
  }

}

Classes

Namesort descending Description
Image Defines an image object to represent an image file.