我有一系列的帖子,所有帖子都有特色图片,但是我需要能够自定义作物右上角。在这种情况下,我需要从右上角裁剪它们,但是了解自己如何定位该点也会很有用。图像的中心。并不总是很漂亮!

#1 楼

中间图像生成极其严格。 image_resize()使它与代码保持紧密联系,并且完全没有钩子。

我需要此代码才能工作,以便以后可以共享一些代码。请注意,以这种方式设置作物需要了解wp_generate_attachment_metadata

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;
}


评论


听起来很像弄乱核心!!

–轻度绒毛
11年6月24日在9:35

不,要弄乱内核会改变image_resize函数。 Rarst提出要调整大小的过程,但您自己手动创建图像大小。

–TheDeadMedic
11年6月24日在10:02

请问这是否仍然有效?我刚刚在我的functions.php文件中实现了该钩子,并且设置了add_image_size()函数,但是裁剪后的图像仍然从中心位置裁剪出来。

–cr0z3r
2011年12月9日在22:40

@ cr0z3r我不知道为什么它不起作用。但是请注意,这仅是粗略的概念验证示例,而不是有意义的可靠代码。

–稀有
2011-12-10 13:50

嗯,很奇怪,它不适用于我的主题-可能是因为我在本地跑步(我对此表示高度怀疑)吗?我将在线上将其展示给您。

–cr0z3r
2011-12-15 15:32

#2 楼

Wordpress Codex的答案如下。


通过裁切图像并定义裁切位置来设置图像大小:

add_image_size( 'custom-size', 220, 220, array( 'left', 'top' ) ); // Hard crop left top


设置裁切位置时,数组中的第一个值为x
轴裁切位置,第二个值为y轴裁切位置。

x_crop_position接受'left''center'或“正确”。 y_crop_position
接受“顶部”,“中心”或“底部”。默认情况下,使用硬作物模式时,这些值默认
为“居中”。 br />
http://havecamerawilltravel.com/photographer/wordpress-thumbnail-crop


评论


这很棒,我认为应该是可以接受的答案!

–道尔顿·鲁尼
2015年11月8日在20:57

#3 楼

我已经针对此问题开发了一种解决方案,不需要破解内核:http://bradt.ca/archives/image-crop-position-in-wordpress/

我还提交了补丁到核心:
http://core.trac.wordpress.org/ticket/19393

将自己作为抄送人添加到票证上,以表示支持将其添加到核心中。

评论


@Rarst的解决方案也不会更改核心文件。 ;)

– fuxia♦
2012年2月19日15:25

@toscho我想他并不意味着其他答案会改变核心代码。

– kaiser
2012年2月20日15:16

#4 楼

您可以使用插件“缩略图裁剪位置”来选择缩略图的裁剪位置。

#5 楼

此处的替代解决方案: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 );


评论


您好Niente0,欢迎来到WPSE,谢谢您的回答。您介意编辑您的文章以解释您的代码做什么吗? StackExchange网站上的帖子应说明其解决方案,并且仅包含异地链接作为参考,而不作为整个解决方案。再次感谢!

–蒂姆·马隆(Tim Malone)
16-4-27的9:52