WordPress.org

Make WordPress Core

Ticket #42663: imagick.3.diff

File imagick.3.diff, 2.5 KB (added by calin, 3 years ago)
  • wp-includes/class-wp-image-editor-imagick.php

    old new  
    2121         */
    2222        protected $image;
    2323
     24        static protected $can_use_filehandles = false;
     25
    2426        public function __destruct() {
    2527                if ( $this->image instanceof Imagick ) {
    2628                        // we don't need the original in memory anymore
     
    8284                        return false;
    8385                }
    8486
     87                if ( version_compare( phpversion( 'imagick' ), '3.2.0', '>' ) and in_array( 'writeimagefile', $class_methods ) && in_array( 'readimagefile', $class_methods ) ) {
     88                        self::$can_use_filehandles = true;
     89                }
     90
    8591                // HHVM Imagick does not support loading from URL, so fail to allow fallback to GD.
    8692                if ( defined( 'HHVM_VERSION' ) && isset( $args['path'] ) && preg_match( '|^https?://|', $args['path'] ) ) {
    8793                        return false;
     
    144150                        $file_extension = strtolower( pathinfo( $this->file, PATHINFO_EXTENSION ) );
    145151                        $filename = $this->file;
    146152
     153                        $imagick_filename = null;
    147154                        if ( 'pdf' == $file_extension ) {
    148                                 $filename = $this->pdf_setup();
     155                                if ( self::$can_use_filehandles ) {
     156                                        $imagick_filename = $this->pdf_setup();
     157                                } else {
     158                                        $filename = $this->pdf_setup();
     159                                }
    149160                        }
    150161
    151162                        // Reading image after Imagick instantiation because `setResolution`
    152163                        // only applies correctly before the image is read.
    153                         $this->image->readImage( $filename );
     164                        if ( self::$can_use_filehandles ) {
     165                                $this->image->readImageFile( fopen( $filename, 'rb' ), $imagick_filename );
     166                        } else {
     167                                $this->image->readImage( $filename );
     168                        }
    154169
    155170                        if ( ! $this->image->valid() )
    156171                                return new WP_Error( 'invalid_image', __('File is not an image.'), $this->file);
     
    622637                        // Store initial Format
    623638                        $orig_format = $this->image->getImageFormat();
    624639
    625                         $this->image->setImageFormat( strtoupper( $this->get_extension( $mime_type ) ) );
    626                         $this->make_image( $filename, array( $image, 'writeImage' ), array( $filename ) );
     640                        $image_format = strtoupper( $this->get_extension( $mime_type ) );
     641
     642                        if ( self::$can_use_filehandles ) {
     643                                $fp = fopen( $filename, 'wb' );
     644                                $this->make_image( $filename, array( $image, 'writeImageFile' ), array( $fp, $image_format ) );
     645                                fclose( $fp );
     646                        } else {
     647                                $this->image->setImageFormat( $image_format );
     648                                $this->make_image( $filename, array( $image, 'writeImage' ), array( $filename ) );
     649                        }
    627650
    628651                        // Reset original Format
    629652                        $this->image->setImageFormat( $orig_format );