上部から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
コアをいじるようなものですね!
マイルドファズ

5
いいえ、コアをいじるだけでimage_resize機能が変更されます。Rarstは、サイズ変更プロセスにフックする必要があるが、手動で画像サイズを作成する必要があると指摘していました。
TheDeadMedic

これがまだ機能するかどうか尋ねてもいいですか?functions.phpファイルにフックを実装したばかりで、add_image_size()関数がセットアップされていますが、トリミングされた画像はまだ中央からトリミングされています。
cr0z3r

@ cr0z3r動作しない理由はわかりません。ただし、これは意味のある信頼できるコードではなく、概念の大まかな実証例にすぎないことに注意してください。
ラースト

うーん、奇妙なことに、それは私のテーマでは動作しません-ローカルで実行していたからかもしれません(私はそれを非常に疑います)?オンラインで公開し、すぐに紹介します。
cr0z3r

13

Wordpressのコーデックスには、その答えがあります。

画像をトリミングしてトリミング位置を定義することにより、画像サイズを設定します。

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

トリミング位置を設定する場合、配列の最初の値はx軸のトリミング位置、2番目はy軸のトリミング位置です。

x_crop_positionは、「left」、「center」、または「right」を受け入れます。y_crop_positionは、「top」、「center」、または「bottom」を受け入れます。デフォルトでは、ハードクロップモードを使用する場合、これらの値はデフォルトで「中央」になります。

また、コーデックスは、トリミング位置がどのように機能するかを示すページを参照します。

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


これは素晴らしいです、受け入れられた答えであるべきだと思います!
ダルトン

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サイトの投稿では、ソリューションを説明し、ソリューション全体としてではなく、参照としてオフサイトリンクのみを含める必要があります。再度、感謝します!
ティムマローン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.