我有一个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.
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-40917
以下是生成的hello-image
(670x300)大小,小(670×377)图像,从问题中,我们将质量设置为40:
imagejpeg( $resource, $image, 40 );
以下是相同的,但质量设置为0:
imagejpeg( $resource, $image, 0 );
看来我们
don\'t 获得与问题中描述的相同行为,即当质量设置为40时,它将变为0
hello-image
670x377原始图像的大小。