为自定义图像大小设置JPEG压缩在特定情况下不起作用

时间:2017-06-24 作者:Christine Cooper

我有一个custom image size hello-image:

add_image_size( \'hello-image\', 700, 300, true );
每当上传图像时,我都会压缩裁剪的hello-image 将图像大小调整为40% JPEG压缩。它在所有情况下都很有效,除了。。。

如果width 原始图像的700px 它工作得很好。但是如果它的宽度小于700px, 压缩到大约0%.

如何测试它下载以下两幅图片:

BIG: 784px × 441px

SMALL: 670px × 377px

然后我创建了一个插件,其中包含所有相关代码:

<?php
/*
Plugin Name: WPSE: custom image size and JPEG compression
Description: custom image size and JPEG compression
Author: WPSE
Version: 1.0
*/

// Set JPEG compression quality
add_filter(\'jpeg_quality\', create_function(\'$quality\', \'return 100;\'));

add_action(\'added_post_meta\', \'ad_update_jpeg_quality\', 10, 4);

function ad_update_jpeg_quality($meta_id, $attach_id, $meta_key, $attach_meta) {

    if ($meta_key == \'_wp_attachment_metadata\') {

        $post = get_post($attach_id);

        if ($post->post_mime_type == \'image/jpeg\' && is_array($attach_meta[\'sizes\'])) {

            $pathinfo = pathinfo($attach_meta[\'file\']);
            $uploads = wp_upload_dir();
            $dir = $uploads[\'basedir\'] . \'/\' . $pathinfo[\'dirname\'];

            foreach ($attach_meta[\'sizes\'] as $size => $value) {

                $image = $dir . \'/\' . $value[\'file\'];
                $resource = imagecreatefromjpeg($image);

                if ($size == \'large\') {

                    // set the jpeg quality for \'large\' size
                    imagejpeg($resource, $image, 35);

                } elseif ($size == \'medium\') {

                    // set the jpeg quality for the \'medium\' size
                    imagejpeg($resource, $image, 35);

                } elseif ($size == \'hello-image\') {

                    // set the jpeg quality for the \'hello-image\' size
                    imagejpeg($resource, $image, 40);

                } else {

                    // set the jpeg quality for the rest of sizes
                    imagejpeg($resource, $image, 35); // 38
                }

                imagedestroy($resource);
            }
        }
    }
}


// add custom image sizes to media uploader
function my_insert_custom_image_sizes( $sizes ) {
    // get the custom image sizes
    global $_wp_additional_image_sizes;
    // if there are none, just return the built-in sizes
    if ( empty( $_wp_additional_image_sizes ) )
        return $sizes;

    // add all the custom sizes to the built-in sizes
    foreach ( $_wp_additional_image_sizes as $id => $data ) {
        // take the size ID (e.g., \'my-name\'), replace hyphens with spaces,
        // and capitalise the first letter of each word
        if ( !isset($sizes[$id]) )
            $sizes[$id] = ucfirst( str_replace( \'-\', \' \', $id ) );
    }

    return $sizes;
}

// Which custom image size selected by default
function my_set_default_image_size () {
    return \'hello-image\';
}

function custom_image_setup () {
    // custom image sizes
    add_image_size( \'medium\', 300, 9999 ); //  medium
    add_image_size( \'hello-image\', 700, 300, true ); // custom
    add_image_size( \'large\', 700, 3000 ); //  large

    add_filter( \'image_size_names_choose\', \'my_insert_custom_image_sizes\' );
    add_filter( \'pre_option_image_default_size\', \'my_set_default_image_size\' );
}

add_action( \'after_setup_theme\', \'custom_image_setup\' );
现在,上传大图像,看看hello-image 图像压缩良好。然后上传小图像,看看同样大小的图像是如何被严重压缩的。为了澄清,以下是结果:

700x300 = 40% compression
670x300 = 0% compression
它们都是通过完全相同的自定义图像大小生成的。原因是什么?如何解决?

我应该强调的是,我的同事发布了question here 询问如果宽度小于700px... 但我是一个WordPress极客,宁愿解决问题的原因,也不愿添加一个黑客补丁。

最后,我在最近的WordPress更新中发现了这个问题,所以这可能是核心的bug,而不是代码中的问题。

Edit: 阅读update.

2 个回复
SO网友:birgire

一些建议:

如果要试用图像编辑器API,可以尝试替换

imagejpeg( $resource, $image, 35 );
使用:

$editor = wp_get_image_editor( $image );  
if ( ! is_wp_error( $editor ) )
{
    $editor->set_quality( 35 );
    $editor->save( $image  );
}
unset( $editor );
还应尝试测试以下部件:

$resource = imagecreatefromjpeg( $image );
if( false !== $resource )
{
    imagejpeg( $resource, $image, 35 );
    imagedestroy( $resource );
}
在独立的PHP脚本中,确保它不是与PHP或GD相关的问题。

PS:Here\'s a different approach 我们尝试修改图像质量before 生成图像大小。

Testing the plugin

让我们从主要问题中检查插件。

测试安装

WordPress版本4.9-alpha-40917gdimagick

以下是生成的hello-image (670x300)大小,小(670×377)图像,从问题中,我们将质量设置为40:

imagejpeg( $resource, $image, 40 );

q=40

以下是相同的,但质量设置为0:

imagejpeg( $resource, $image, 0 );

q=0

看来我们don\'t 获得与问题中描述的相同行为,即当质量设置为40时,它将变为0hello-image 670x377原始图像的大小。

SO网友:berend

有趣的是,我试过了,小图像显示为670x300,大图像显示为700x300。在我看来,its正在做它需要做的事情,如果高度或宽度高于图像类型(或两者都高于),它会裁剪图像。

我知道你只想裁剪高度更高的图像?然后,使用该选项可以:

  add_image_size( \'hello-world\', 700, 0, true );
之后我重新上传图像,小图像显示670×377,大图像显示700×394。我上传了另一个较小的版本(516x290),它根本没有被裁剪。

虽然当您上传像690x4000这样的图像时,它也不会被裁剪。

结束

相关推荐

Featured images get shrunken

上传特色图片时,我遇到的问题是,所有图片都会自动缩小。我想保留原始图像。检查this example. 所有员工的图片都会自动缩小,但在特色图片中,我上传了员工的完整图片。我认为图像太大,wordpress会自动缩小图像,因此,我在媒体库中缩放并裁剪了图像。一些图像已修复,但一些图像仍然存在问题。有没有一种方法可以让原始上传的图像按原样显示?