非常特殊的过滤器jpeg_quality
过滤器是一个非常特殊的过滤器:它在三种不同的情况下使用,您必须使用第二个参数来确定是否要使用过滤器。
不要让它做任何事情,这种特殊过滤器的主要问题是,如果不删除它,它可能会为以后的操作触发-允许它在第一次检查后运行。所以我们需要在里面装另一个过滤器wp_save_image_file()
检查是否要更改压缩。为了在另一个保存过程中禁用它,我们在更改压缩之前将其删除。
kool kid真正奇怪的是,WP对every 保存进程。这意味着,每次上载/裁剪/编辑图像时,都会降低其质量。。。这对于那些不是最好的图像来说是一件痛苦的事,当你上传它们时(用一个包含大量红色和高对比度背景的图像进行测试)。But... 真正有趣的是,你可以改变这种行为。所以你想改变压缩,但是get increased quality - 同时,比core允许的要好得多。
/**
* Alter the image compression, depending on case
*
* @param int $compression
* @param string $case
* @return int $compression
*/
function wpse58600_custom_jpg_compression_cb( $compression, $case )
{
global $size_switch;
// Should only fire once - don\'t leave it in for later cases
remove_filter( current_filter(), __FUNCTION__ );
// Alter the compression, depending on the case
switch ( $case )
{
case( \'edit_image\' ) :
// We only add the compression, if the switch triggered,
// which means, that the size is smaller, than set in the main function.
// 60 is the percentage value, that gets added as compression to the smaller images.
$compression = $size_switch ? 60 : 100;
break;
case( \'image_resize\' ) :
// Better leave it on 100% for resize
$compression = 100;
break;
case( \'wp_crop_image\' ) :
// Better leave it on 100% for crop
// We already compressed it on the camera, the desktop/handheld device
// and the server previously. That\'s enough so far.
$compression = 100;
break;
}
return $compression;
}
/**
* Alter the compression for JPEG mime type images
* Checks for a specific min size of the image, before altering it
*
* @param string $image
* @param int $post_id
* @return string $image
*/
function wpse58600_custom_jpg_compression( $image, $post_id )
{
global $size_switch;
$size_switch = false;
// Define the size, that stops adding a compression
$trigger_size = 641;
// Get the sizes
$size_x = imagesx( $image );
$size_y = imagesy( $image );
// Add the filter only in case
if ( $trigger_size < $size_x )
{
$size_switch = true;
}
add_filter( \'jpeg_quality\', \'wpse58600_custom_jpg_compression_cb\', 20, 2 );
return $image;
}
add_filter( \'image_save_pre\', \'wpse58600_custom_jpg_compression\', 20, 2 );
EDIT: 在与@toscho进行了简短的讨论后,他指出,整个回调可以简化为以下内容:
function wpse58600_custom_jpg_compression_cb( $compression, $case )
{
// Should only fire once - don\'t leave it in for later cases
remove_filter( current_filter(), __FUNCTION__ );
return ( $GLOBALS[\'size_switch\'] && \'edit_image\' === $case ) ? 60 : 100;
}
当我从当前正在开发的插件中提取代码时,我需要
switch
在中添加设置。我还必须注意,我不使用
global
在我的插件中,这是一种面向对象的方法。您可以读取的代码↑ 上面的代码主要是从插件中删减和修改的代码,这有一些小的遗留问题,对以后的读者来说是解释性的,仍然有效。如果您想将其用作插件,可以根据您的个人用例进行一些优化。
注意:根据对不同任务的一些调查,我注意到$case
通过以下步骤触发:
旋转:edit-image
»image-resize
(对于您选择的任何大小,后面的1×为缩略图等)
镜像:edit-image
»image-resize
(-“--”)这意味着
jpeq_quality
对于旋转/镜像图像,将触发2倍;对于添加的任何其他大小,将触发+1倍。因此,如果你得到低于100%,它将降低质量两倍。我在这个主题上做了很多研究,但我仍然不能完全确定到底是什么函数导致了这种行为。