根据图像大小更改JPEG压缩

时间:2012-07-15 作者:DarkGhostHunter

短的我希望“大”图像压缩90%,而“中”图像压缩60%。有很多af,你知道,有时较大的图像会受到高压缩,但其他小图像不会。

此功能允许对所有jpg图像重新采样

function custom_jpg_compression($args) {
    return 90;
}
add_filter(\'jpeg_quality\', \'custom_jpg_compression\');
如何按图像大小过滤?

1 个回复
最合适的回答,由SO网友:kaiser 整理而成

非常特殊的过滤器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%,它将降低质量两倍。我在这个主题上做了很多研究,但我仍然不能完全确定到底是什么函数导致了这种行为。

    结束

    相关推荐

    Taxonomy search filters

    我使用几种分类法开发了几个国家的教育课程数据库。国家、研究所、研究水平和其他一些是分类法。如果用户单击某个国家/地区,将显示该国家/地区的所有课程。如何在保留在同一国家/地区的情况下过滤结果(研究所、学习水平等)。我想把它放在存档页上,这样每个搜索都可以进一步过滤。