Add ->get_quality() method to WP_Image_Editor class.

Adds unit tests.

Props markoheijnen.
Fixes #28154.


git-svn-id: https://develop.svn.wordpress.org/trunk@28879 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Scott Taylor 2014-06-28 03:49:55 +00:00
parent 34ed4c44f5
commit c2b7f8022c
4 changed files with 56 additions and 45 deletions

View File

@ -114,7 +114,7 @@ class WP_Image_Editor_GD extends WP_Image_Editor {
$this->update_size( $size[0], $size[1] );
$this->mime_type = $size['mime'];
return $this->set_quality( $this->quality );
return true;
}
/**
@ -394,7 +394,7 @@ class WP_Image_Editor_GD extends WP_Image_Editor {
}
}
elseif ( 'image/jpeg' == $mime_type ) {
if ( ! $this->make_image( $filename, 'imagejpeg', array( $image, $filename, $this->quality ) ) )
if ( ! $this->make_image( $filename, 'imagejpeg', array( $image, $filename, $this->get_quality() ) ) )
return new WP_Error( 'image_save_error', __('Image Editor Save Failed') );
}
else {
@ -442,7 +442,7 @@ class WP_Image_Editor_GD extends WP_Image_Editor {
return imagegif( $this->image );
default:
header( 'Content-Type: image/jpeg' );
return imagejpeg( $this->image, null, $this->quality );
return imagejpeg( $this->image, null, $this->get_quality() );
}
}

View File

@ -143,7 +143,7 @@ class WP_Image_Editor_Imagick extends WP_Image_Editor {
if ( is_wp_error( $updated_size ) )
return $updated_size;
return $this->set_quality( $this->quality );
return true;
}
/**
@ -160,7 +160,7 @@ class WP_Image_Editor_Imagick extends WP_Image_Editor {
if ( is_wp_error( $quality_result ) ) {
return $quality_result;
} else {
$quality = $this->quality;
$quality = $this->get_quality();
}
try {

View File

@ -16,7 +16,8 @@ abstract class WP_Image_Editor {
protected $size = null;
protected $mime_type = null;
protected $default_mime_type = 'image/jpeg';
protected $quality = 90;
protected $quality = false;
protected $default_quality = 90;
/**
* Each instance handles a single file.
@ -202,6 +203,49 @@ abstract class WP_Image_Editor {
return true;
}
/**
* Gets the Image Compression quality on a 1-100% scale.
*
* @since 4.0.0
* @access public
*
* @return int $quality Compression Quality. Range: [1,100]
*/
public function get_quality() {
if ( ! $this->quality ) {
/**
* Filter the default image compression quality setting.
*
* @since 3.5.0
*
* @param int $quality Quality level between 1 (low) and 100 (high).
* @param string $mime_type Image mime type.
*/
$quality = apply_filters( 'wp_editor_set_quality', $this->default_quality, $this->mime_type );
if ( 'image/jpeg' == $this->mime_type ) {
/**
* Filter the JPEG compression quality for backward-compatibility.
*
* The filter is evaluated under two contexts: 'image_resize', and 'edit_image',
* (when a JPEG image is saved to file).
*
* @since 2.5.0
*
* @param int $quality Quality level between 0 (low) and 100 (high) of the JPEG.
* @param string $context Context of the filter.
*/
$quality = apply_filters( 'jpeg_quality', $quality, 'image_resize' );
if ( ! $this->set_quality( $quality ) ) {
$this->quality = $this->default_quality;
}
}
}
return $this->quality;
}
/**
* Sets Image Compression quality on a 1-100% scale.
*
@ -212,41 +256,12 @@ abstract class WP_Image_Editor {
* @return boolean|WP_Error True if set successfully; WP_Error on failure.
*/
public function set_quality( $quality = null ) {
if ( $quality == null ) {
$quality = $this->quality;
// Allow 0, but squash to 1 due to identical images in GD, and for backwards compatibility.
if ( $quality == 0 ) {
$quality = 1;
}
/**
* Filter the default image compression quality setting.
*
* @since 3.5.0
*
* @param int $quality Quality level between 1 (low) and 100 (high).
* @param string $mime_type Image mime type.
*/
$quality = apply_filters( 'wp_editor_set_quality', $quality, $this->mime_type );
if ( 'image/jpeg' == $this->mime_type ) {
/**
* Filter the JPEG compression quality for backward-compatibility.
*
* The filter is evaluated under two contexts: 'image_resize', and 'edit_image',
* (when a JPEG image is saved to file).
*
* @since 2.5.0
*
* @param int $quality Quality level between 0 (low) and 100 (high) of the JPEG.
* @param string $context Context of the filter.
*/
$quality = apply_filters( 'jpeg_quality', $quality, 'image_resize' );
// Allow 0, but squash to 1 due to identical images in GD, and for backwards compatibility.
if ( $quality == 0 ) {
$quality = 1;
}
}
if ( ( $quality >= 1 ) && ( $quality <= 100 ) ){
if ( ( $quality >= 1 ) && ( $quality <= 100 ) ) {
$this->quality = $quality;
return true;
} else {

View File

@ -52,19 +52,15 @@ class Tests_Image_Editor extends WP_Image_UnitTestCase {
// Get an editor
$editor = wp_get_image_editor( DIR_TESTDATA . '/images/canola.jpg' );
// Make quality readable
$property = new ReflectionProperty( $editor, 'quality' );
$property->setAccessible( true );
// Ensure set_quality works
$this->assertTrue( $editor->set_quality( 75 ) );
$this->assertEquals( 75, $property->getValue( $editor ) );
$this->assertEquals( 75, $editor->get_quality() );
// Ensure the quality filter works
$func = create_function( '', "return 100;");
add_filter( 'wp_editor_set_quality', $func );
$this->assertTrue( $editor->set_quality( 75 ) );
$this->assertEquals( 100, $property->getValue( $editor ) );
$this->assertEquals( 75, $editor->get_quality() );
// Clean up
remove_filter( 'wp_editor_set_quality', $func );