web-dev-qa-db-ja.com

投稿に挿入する前に画像をトリミングする

私はフロントエンドの投稿フォームを持っており、画像をアップロードして投稿に挿入できるようにするために、このPHPコードを使用しています。

    // image upload and attatching to post
    if ( ! empty( $_FILES ) && ! empty( $_FILES['upload-image']['name'] ) ) {

        // upload image to server
        $upload = wp_upload_bits( $_FILES['upload-image']['name'], null, file_get_contents( $_FILES['upload-image']['tmp_name'] ) );

        // insert new image to the just created post ================================
        $wp_filetype = wp_check_filetype( basename( $upload['file'] ), null );
        $wp_upload_dir = wp_upload_dir();

        $attachment = array(
            'guid'           => $wp_upload_dir['baseurl'] . _wp_relative_upload_path( $upload['file'] ),
            'post_mime_type' => $wp_filetype['type'],
            'post_title'     => preg_replace('/\.[^.]+$/', '', basename( $upload['file'] )),
            'post_content'   => '',
            'post_status'    => 'inherit'
        );
        $attach_id = wp_insert_attachment( $attachment, $upload['file'], $post_id );

        require_once(ABSPATH . 'wp-admin/includes/image.php');

        $attach_data = wp_generate_attachment_metadata( $attach_id, $upload['file'] );      
        wp_update_attachment_metadata( $attach_id, $attach_data );
        update_post_meta( $post_id, '_thumbnail_id', $attach_id );
        // end insert ==============================================

    }

すべての画像がポストに挿入される前に、16:9のアスペクト比に確実にトリミングされるようにするにはどうすればよいですか?したがって、画像の高さが高すぎる場合は、上下をトリミングして16:9の比率に合わせます。画像の幅が広すぎる場合は、側面をトリミングして16:9の比率に合わせます。

ここで、画像を常に16:9の比率にトリミングして、それを基にすることができる関数を見つけました: https://stackoverflow.com/questions/29063094/php-fit-any-size-image -to-169-aspect-ratio (テストされていません)。しかし、上記の上記のコードでこれを使用する方法がわかりません。16:9の比率の画像は、投稿に挿入する前に準備する必要があります。

助けてくれてありがとう。

1
Andy

いいと思いますが、他の機能を使う必要はありません。あなたはすべて持っています

File: wp-includes/media.php

たとえば、画像のサイズを取得するには_wp_get_image_size_from_metaを使用できるため、次のようなものを使用する必要はありません。

$size = getimagesize($file);
$width = $size[0];
$height = $size[1];
$mime = $size['mime'];

画像のサイズとタイプを取得します。

一方、add_image_sizeを使用しない理由は明らかではありません

File: wp-includes/media.php
256: /**
257:  * Register a new image size.
258:  *
259:  * Cropping behavior for the image size is dependent on the value of $crop:
260:  * 1. If false (default), images will be scaled, not cropped.
261:  * 2. If an array in the form of array( x_crop_position, y_crop_position ):
262:  *    - x_crop_position accepts 'left' 'center', or 'right'.
263:  *    - y_crop_position accepts 'top', 'center', or 'bottom'.
264:  *    Images will be cropped to the specified dimensions within the defined crop area.
265:  * 3. If true, images will be cropped to the specified dimensions using center positions.
266:  *
267:  * @since 2.9.0
268:  *
269:  * @global array $_wp_additional_image_sizes Associative array of additional image sizes.
270:  *
271:  * @param string     $name   Image size identifier.
272:  * @param int        $width  Image width in pixels.
273:  * @param int        $height Image height in pixels.
274:  * @param bool|array $crop   Optional. Whether to crop images to specified width and height or resize.
275:  *                           An array can specify positioning of the crop area. Default false.
276:  */
277: function add_image_size( $name, $width = 0, $height = 0, $crop = false ) {
278:    global $_wp_additional_image_sizes;
279: 
280:    $_wp_additional_image_sizes[ $name ] = array(
281:        'width'  => absint( $width ),
282:        'height' => absint( $height ),
283:        'crop'   => $crop,
284:    );
285: }

$cropオプションをtrueに設定して、16:9の比率のサムネイルを作成できます。これにより、画像が特定のサイズに整理されます。

複数回追加できます。

add_image_size( 'andy1', 160, 90 , true);
add_image_size( 'andy2', 1600, 900, true);

そして、可能であればサムネイルが作成され、好きな方法で作成されます。

image srcset属性を使用する場合、これは便利です。

1
prosti