상단에서 add_image_size () 자르기를 어떻게 만들 수 있습니까?


20

추천 이미지가 포함 된 일련의 게시물이 있지만 자르기 오른쪽 상단 모서리를 사용자 정의 할 수 있어야합니다. 이 경우 오른쪽 위에서 자르기를 원하지만 그 위치를 직접 지정하는 방법도 아는 것이 좋습니다.

현재 add_image_size () 함수는 이미지 중앙에서 자르기를 수행하고 있습니다. 항상 예쁘지는 않습니다 !!

답변:


13

중간 이미지 생성은 매우 견고합니다. image_resize()코드에 가깝게 유지하고 후크가 완전히 없습니다.

이것에 대한 유일한 옵션은 wp_generate_attachment_metadataWP 생성 이미지를 연결하고 자신의 이미지로 덮어 쓰는 것입니다 ( 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;
}

1
핵심을 망쳐 놓는 것 같아요!
Mild Fuzz

5
아니요, 핵심을 어지럽히면 image_resize기능 이 변경 됩니다. Rarst는 크기 조정 프로세스에 연결해야한다는 점을 지적했지만 직접 이미지 크기를 직접 만들었습니다.
TheDeadMedic

그래도 작동하는지 물어봐도 될까요? 방금 functions.php 파일에 후크를 구현하고 add_image_size () 함수를 설정했지만 자른 이미지는 여전히 중앙에서 잘립니다.
cr0z3r

@ cr0z3r 왜 작동하지 않는지 알 수 없습니다. 그러나 이것은 의미있는 신뢰할 수있는 코드가 아니라 개념 증명 예제 일뿐입니다.
Rarst December

흠, 이상하게도, 그것은 내 테마에서 작동하지 않습니다-내가 로컬에서 달리고 있었기 때문일 수 있습니까? 온라인으로 가져 가서 곧 보여 드리겠습니다.
cr0z3r

13

워드 프레스 코덱스에 대한 답이 아래에 있습니다.

이미지를 자르고 자르기 위치를 정의하여 이미지 크기를 설정하십시오.

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

자르기 위치를 설정할 때 배열의 첫 번째 값은 x 축 자르기 위치이고 두 번째 값은 y 축 자르기 위치입니다.

x_crop_position은 'left' 'center'또는 'right'를 허용합니다. y_crop_position은 'top', 'center'또는 'bottom'을 허용합니다. 기본적으로 하드 자르기 모드를 사용할 때이 값은 '가운데'로 설정됩니다.

또한 코덱은 자르기 위치의 작동 방식을 보여주는 페이지를 참조합니다.

http://havecamerawilltravel.com/photographer/wordpress-thumbnail-crop


이것은 굉장합니다, 받아 들여야 할 대답이어야합니다.
Dalton

7

핵심을 해킹 할 필요가없는이 문제에 대한 해결책을 개발했습니다 : http://bradt.ca/archives/image-crop-position-in-wordpress/

또한 코어에 패치를 제출했습니다 : http://core.trac.wordpress.org/ticket/19393

티켓에 Cc로 자신을 추가하여 코어에 추가 될 수 있도록 지원하십시오.


2
@Rarst의 솔루션은 코어 파일도 변경하지 않습니다. ;)
fuxia

1
@ toscho 다른 답변이 핵심 코드를 변경한다는 의미는 아닙니다.
카이저


0

대체 솔루션 : 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.