48
Image Manipulation in WordPress 3.5 WordCamp Phoenix 2013 Mike Schroder (DH-Shredder) @GetSource - http://www.getsource.net

Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

Embed Size (px)

DESCRIPTION

Image Manipulation in WordPress 3.5 talk from WordCamp Phoenix 2013 Image manipulation in WordPress was an alchemy of mixing GD functions and WordPress functions together to (hopefully) turn out the desired result. Now, as of WordPress 3.5, GD is abstracted out, and a new class, WP_Image_Editor, allows easy manipulation of image files. This lets you perform simple resizing, crops, flips, rotates, and real-time streaming of those results using Imagick or GD. But, that’s not all! You can also easily extend WordPress’ classes to add your own functions, or replace the entire engine with your own. This session will walk through what’s changed for image manipulation in WordPress 3.5, and explain ways you can take advantage of the new APIs, both through using them directly and extending them for plugins of your own. Presented by Mike Schroder (@GetSource/DH-Shredder)

Citation preview

Page 1: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

Image Manipulation in WordPress 3.5

WordCamp Phoenix 2013

Mike Schroder (DH-Shredder)@GetSource - http://www.getsource.net

Page 2: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

Who Am I?

• Mike Schroder, a.k.a DH-Shredder, a.k.a. @GetSource

• Third Culture Kid, enjoy Coffee & Sailing

• WordPress 3.5 Recent Rockstar and wp-cli Contributor

• Co-Author of WP_Image_Editor

• Happy DreamHost Employee

Page 3: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

What was wrong?

Page 4: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

GD was used directly.

Page 5: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

This meant a mess of functions for Developers.

Page 6: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

What changed?

Page 7: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

GD was abstracted.

Page 8: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

WP_Image_Editor is born.

Page 9: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

What’s WP_Image_Editor?

Centralized way to read an image file directly, manipulate it, and output

Page 10: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

Community Built.

Primarily Marko Heijnen and I, with awesome help from Japh Thomson, Kurt Payne,

Andrew Nacin and Cristi Burcă

Page 11: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

3.5 comes with Editors for GD and Imagick support

Page 12: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

Imagick 2.2.0+ compiled with Imagemagick 6.2.9+

for full support

Page 13: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

With Imagick, this means support for Color Profiles

Page 14: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

GD Imagick

Page 15: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

GD ImagickGD

Page 16: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

GD ImagickImagick

Page 17: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

GD ImagickGD

Page 18: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

GD ImagickImagick

Page 19: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

What’s the catch?

Deprecated filters from GD abstraction

Page 20: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

Deprecated Filters

• image_save_pre is now image_editor_save_pre

• wp_save_image_file is now wp_save_image_editor_file

• image_edit_before_change is now wp_image_editor_before_change

Page 21: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

What’s it missing?

Centralized way to read an image attachment from the database and

manage its sizes and properties

Page 22: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

That’s WP_Image....Hopefully

Page 23: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

Okay.

So, what can I do with it?

Page 24: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

Resize, Batch Resize, Crop, Flip, Rotate, and Stream.

wp-includes/class-wp-image-editor.php

Page 25: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013
Page 26: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

/** * Tests whether there is an editor that supports a given mime type or methods. * * @since 3.5.0 * @access public * * @param string|array $args Array of requirements. * Accepts { 'mime_type'=>string, 'methods'=>{string, string, ...} } * @return boolean true if an eligible editor is found; false otherwise */ function wp_image_editor_supports( $args = array() ) { ... }

Check for Support.

Page 27: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

/** * Returns a WP_Image_Editor instance and loads file into it. * * @since 3.5.0 * @access public * * @param string $path Path to file to load * @param array $args Additional data. * Accepts { 'mime_type'=>string, 'methods'=>{string, string, ...} } * @return WP_Image_Editor|WP_Error */ function wp_get_image_editor( $path, $args = array() ) { ... }

Instantiate an Editor.

Page 28: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

! /**! * Resizes current image.! *! * @since 3.5.0! * @access public! * @abstract! *! * @param int $max_w! * @param int $max_h! * @param boolean $crop! * @return boolean|WP_Error! */! abstract public function resize( $max_w, $max_h, $crop = false );

Resize.

Page 29: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

! /**! * Processes current image and saves to disk! * multiple sizes from single source.! *! * @since 3.5.0! * @access public! * @abstract! *! * @param array $sizes { {'width'=>int, 'height'=>int, 'crop'=>bool}, ... }! * @return array! */! abstract public function multi_resize( $sizes );

Batch Resize.

Page 30: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

! /**! * Crops Image.! *! * @since 3.5.0! * @access public! * @abstract! *! * @param string|int $src The source file or Attachment ID.! * @param int $src_x The start x position to crop from.! * @param int $src_y The start y position to crop from.! * @param int $src_w The width to crop.! * @param int $src_h The height to crop.! * @param int $dst_w Optional. The destination width.! * @param int $dst_h Optional. The destination height.! * @param boolean $src_abs Optional. If the source crop points are absolute.! * @return boolean|WP_Error! */! abstract public function crop( $src_x, $src_y, $src_w, $src_h, $dst_w = null, ! ! ! ! ! ! ! ! ! ! $dst_h = null, $src_abs = false );

Crop.

Page 31: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

! /**! * Rotates current image counter-clockwise by $angle.! *! * @since 3.5.0! * @access public! * @abstract! *! * @param float $angle! * @return boolean|WP_Error! */! abstract public function rotate( $angle );

Rotate.

Page 32: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

! /**! * Flips current image.! *! * @since 3.5.0! * @access public! * @abstract! *! * @param boolean $horz Horizontal Flip! * @param boolean $vert Vertical Flip! * @return boolean|WP_Error! */! abstract public function flip( $horz, $vert );

Flip!

Page 33: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

! /**! * Streams current image to browser.! *! * @since 3.5.0! * @access public! * @abstract! *! * @param string $mime_type! * @return boolean|WP_Error! */! abstract public function stream( $mime_type = null );

Stream.

Page 34: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

! /**! * Saves current image to file.! *! * @since 3.5.0! * @access public! * @abstract! *! * @param string $destfilename! * @param string $mime_type! * @return array|WP_Error {'path'=>string, 'file'=>string, 'width'=>int! * 'height'=>int, 'mime-type'=>string}! */! abstract public function save( $destfilename = null, $mime_type = null );

Save or Convert.

Page 35: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

// Get instance of WP_Image_Editor selected by WordPress $image = wp_get_image_editor( '/path/to/cool_image.jpg' );

// Returns WP_Error on failure, so check. if ( ! is_wp_error( $image ) ) {

// Rotate in 90 degree increments, for now. $image->rotate( 90 );

// Thumbnail, and crop. $image->resize( 300, 300, true );

// Uses extension for type, unless optional mime parameter is used. $image->save( 'new_image.gif' );

! // Types only limited by Editor and what WordPress allows for uploads. if ( $image->supports_mime_type( 'application/pdf' ) ) $image->stream( 'application/pdf' ); }

Time for an Example!

Page 36: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

To load an attachment...

No current alternative to load_image_to_edit(), so:

wp_get_image_editor( _load_image_to_edit_path( $post_id ) );

Page 37: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

Extend to create your ownimage-manip engines or functions.

Page 38: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

Let’s extend Imagick for everyone’s favorite filter:

Page 39: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

Sepia!

Page 40: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

Sepia makes the world go brown.

Page 41: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

class GS_Imagick_Sepia_Editor extends WP_Image_Editor_Imagick { /** * Filters current in-memory image with Sepia * * @since 1.0 * @access public * * @param int $amount * @return bool|WP_Error */ public function sepia( $amount = 80 ) { try { $this->image->sepiaToneImage( $amount ); return true; } catch ( Exception $e ) { return new WP_Error( 'image_sepia_error', $e->getMessage() ); } }}

Extend from WP_Image_Editor.

Page 42: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

/** * Add Sepia Editor to beginning of editor search array. * * The new editor doesn't need to be at beginning if specifically requesting * an editor with sepia() method, but it's safer overall. */ function gs_add_imagick_sepia( $editors ) { if( ! class_exists( 'GS_Imagick_Sepia_Editor' ) ) include( plugin_dir_path( __FILE__ ) . 'editors/imagick-sepia.php' ); array_unshift( $editors, 'GS_Imagick_Sepia_Editor' ); return $editors; } add_filter( 'wp_image_editors', 'gs_add_imagick_sepia' );

Enqueue your Editor.

Page 43: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

// Request an Editor with the sepia() method. $sepia_editor = wp_get_image_editor( "/path/to/cool-image.jpg", array( 'methods' => array( 'sepia' ) ) );

// Double-check that we have an editor, and the file is open. if ( ! is_wp_error( $sepia_editor ) ) { // Filter with sepia using our new method. $sepia_editor->sepia(); // Send the image to the browser without saving. $sepia_editor->stream(); }

Require and run the new method.

Page 44: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

And, that’s it!

Page 45: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013
Page 46: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

Image Editor Examples

• GD: wp-includes/class-wp-image-editor-gd.php

• Imagick: wp-includes/class-wp-image-editor-imagick.php

• Gmagick: http://wordpress.org/extend/plugins/gmagick/

Page 47: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013
Page 48: Image Manipulation in WordPress 3.5 - WordCamp Phoenix 2013

More Resources!

• http://make.wordpress.org/core/2012/12/06/wp_image_editor-is-incoming/

• http://markoheijnen.com/wordpress-new-image-manipulation/

• http://xref.wordpress.org/trunk/WordPress/Image_Editor/WP_Image_Editor.html

• https://github.com/getsource/imagick-sepia/

• https://github.com/humanmade/WPThumb/

Mike Schroder (DH-Shredder)@GetSource - http://www.getsource.net