Answers:
中间图像生成极其严格。 image_resize()
使它接近代码,并且完全没有钩子。
几乎唯一的选择是wp_generate_attachment_metadata
使用您自己的钩挂并覆盖WP生成的图像(这需要一点image_resize()
刀叉)。
我需要这项工作,以便以后可以共享一些代码。
好的,这很粗糙,但是可以正常工作。请注意,以这种方式设置作物需要了解imagecopyresampled()
。
add_filter('wp_generate_attachment_metadata', 'custom_crop');
function custom_crop($metadata) {
$uploads = wp_upload_dir();
$file = path_join( $uploads['basedir'], $metadata['file'] ); // original image file
list( $year, $month ) = explode( '/', $metadata['file'] );
$target = path_join( $uploads['basedir'], "{$year}/{$month}/".$metadata['sizes']['medium']['file'] ); // intermediate size file
$image = imagecreatefromjpeg($file); // original image resource
$image_target = wp_imagecreatetruecolor( 44, 44 ); // blank image to fill
imagecopyresampled($image_target, $image, 0, 0, 25, 15, 44, 44, 170, 170); // crop original
imagejpeg($image_target, $target, apply_filters( 'jpeg_quality', 90, 'image_resize' )); // write cropped to file
return $metadata;
}
image_resize
功能。Rarst提出要调整大小的过程,但您需要自己创建图像大小。
Wordpress Codex有下面的答案。
通过裁剪图像并定义裁剪位置来设置图像尺寸:
add_image_size( 'custom-size', 220, 220, array( 'left', 'top' ) ); // Hard crop left top
设置裁切位置时,数组中的第一个值是x轴裁切位置,第二个值是y轴裁切位置。
x_crop_position接受“左”,“中心”或“右”。y_crop_position接受“顶部”,“中心”或“底部”。默认情况下,使用硬裁剪模式时,这些值默认为“居中”。
另外,法典还引用了一个页面,该页面显示了作物位置的行为。
http://havecamerawilltravel.com/photographer/wordpress-thumbnail-crop
我已经针对该问题开发了一种解决方案,不需要破解内核:http : //bradt.ca/archives/image-crop-position-in-wordpress/
我还向核心提交了补丁:http : //core.trac.wordpress.org/ticket/19393
将自己作为抄送人添加到票证上,以显示您对将其添加到核心中的支持。
此处的替代解决方案:http : //pixert.com/blog/cropping-post-featured-thumbnails-from-top-instead-of-center-in-wordpress-with-native-cropping-tool/
只需将以下代码添加到functions.php中,然后使用“重新生成缩略图”插件(https://wordpress.org/plugins/regenerate-thumbnails/):
function px_image_resize_dimensions( $payload, $orig_w, $orig_h, $dest_w, $dest_h, $crop ){
// Change this to a conditional that decides whether you want to override the defaults for this image or not.
if( false )
return $payload;
if ( $crop ) {
// crop the largest possible portion of the original image that we can size to $dest_w x $dest_h
$aspect_ratio = $orig_w / $orig_h;
$new_w = min($dest_w, $orig_w);
$new_h = min($dest_h, $orig_h);
if ( !$new_w ) {
$new_w = intval($new_h * $aspect_ratio);
}
if ( !$new_h ) {
$new_h = intval($new_w / $aspect_ratio);
}
$size_ratio = max($new_w / $orig_w, $new_h / $orig_h);
$crop_w = round($new_w / $size_ratio);
$crop_h = round($new_h / $size_ratio);
$s_x = 0; // [[ formerly ]] ==> floor( ($orig_w - $crop_w) / 2 );
$s_y = 0; // [[ formerly ]] ==> floor( ($orig_h - $crop_h) / 2 );
} else {
// don't crop, just resize using $dest_w x $dest_h as a maximum bounding box
$crop_w = $orig_w;
$crop_h = $orig_h;
$s_x = 0;
$s_y = 0;
list( $new_w, $new_h ) = wp_constrain_dimensions( $orig_w, $orig_h, $dest_w, $dest_h );
}
// if the resulting image would be the same size or larger we don't want to resize it
if ( $new_w >= $orig_w && $new_h >= $orig_h )
return false;
// the return array matches the parameters to imagecopyresampled()
// int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h
return array( 0, 0, (int) $s_x, (int) $s_y, (int) $new_w, (int) $new_h, (int) $crop_w, (int) $crop_h );
}
add_filter( 'image_resize_dimensions', 'px_image_resize_dimensions', 10, 6 );