是,WordPress调整大小(&P);根据您的主题所定义的@Gerard,裁剪所有图像。Gerard在回答中已经解释了这一点。最后一个布尔参数add_image_size()
是否裁剪。请注意,这并不定义裁剪位置。改变这种行为look at this answer for example.
核心内部发生了什么
正如您在
add_image_size()
, WP使用
global $_wp_additiona_image_sizes
存储(&A);处理图像生成的设置。现在,当您上载图像时
WP_Image_Editor
进入游戏,根据服务器上启用的PHP扩展,可以调用
WP_Image_Editor_GD
或
WP_Image_Editor_Imagick
. 现在两个单身汉都有
resize()
调用
image_resize_dimensions()
. 最后,
image_resize_dimensions()
做
not 调整图像大小或裁剪图像。它只是计算值。
这是通过以下方法完成的crop()
在里面the Imagick class 并使用PHPs nativeimagecopyresampled()
GD类内部。
如何禁用裁剪
首先,我们有很多可能性:
检测正在使用哪个类(支持哪个PHP ext.),然后拦截用于裁剪的内容(见上文)短路整个过程,让image_resize_dimensions()
这就是工作我们将在这里使用后面的方法。请随意添加您自己的解决方案作为单独的答案。以下是core为我们提供的:一个保存所有参数的过滤器。
$output = apply_filters( \'image_resize_dimensions\', null, $orig_w, $orig_h, $dest_w, $dest_h, $crop );
第一个论点是
null
, 这将在下一行告诉core我们是否要覆盖此函数的内部功能,并用我们自己的行为替换它。所以如果我们除了
null
, 那么这就是核心将要使用的。请记住,您可以将任何内容放在那里,但core仍然期望与
image_resize_dimensions()
按默认值使用。从内联注释中:
返回数组将参数匹配到imagecopyresampled()
:
int dst_x, int dst_y,
int src_x, int src_y,
一二
add_image_size()
二现在要禁用crop,我们必须替换(换言之:克隆)整个内部-这是我们想要避免的。因此,我们使用的是;一次性过滤器“;这会使其自身失效。我们这样做是为了使用内部结构,但只是去掉我们不需要的东西。
<?php
defined( \'ABSPATH\' ) or exit;
/* Plugin Name: (#124009) Disable image crop */
add_filter( \'image_resize_dimensions\', \'wpse124009DisableCrop\', 10, 6 );
function wpse124009DisableCrop( $enable, $orig_w, $orig_h, $dest_w, $dest_h, $crop )
{
// Instantly disable this filter after the first run
remove_filter( current_filter(), __FUNCTION__ );
return image_resize_dimensions( $orig_w, $orig_h, $dest_w, $dest_h, false );
}
现在,到处都禁用裁剪。如果您正在运行multisite,或者不想考虑是否启用了此插件,只需将其用作mu插件即可。
请记住,以上不是经过测试的,而是在阅读核心源代码后从我的脑海中注销的
其他信息
有关中图像处理类的更多信息
the slides of Marko from WordCamp Europe 可以找到演示视频
on WordPress.tv.