web-dev-qa-db-fra.com

Recadrer une image avant de l'insérer dans une publication

J'ai un formulaire de publication frontale et j'utilise ce code PHP pour permettre le téléchargement d'une image et l'insérer dans une publication.

    // 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 ==============================================

    }

Comment puis-je m'assurer que toutes les images sont recadrées au format 16: 9 avant d'être insérées dans le message? Donc, si la hauteur de l'image est trop élevée, elle recadre le haut et le bas pour l'adapter au rapport 16: 9, et si la largeur de l'image est trop large, elle recadre les côtés pour l'adapter au rapport 16: 9.

J'ai trouvé une fonction qui recadre toujours l'image au format 16: 9 ici sur laquelle je pourrais la baser: https://stackoverflow.com/questions/29063094/php-fit-any-size-image -to-169-aspect-ratio (non testé). Mais je ne sais pas comment utiliser cela dans mon code ci-dessus - l'image au rapport 16: 9 doit être prête avant de l'insérer dans le message.

Toute aide appréciée.

1
Andy

Je pense que vous êtes bon, mais vous n'avez pas besoin d'utiliser d'autres fonctions. Vous avez tout

File: wp-includes/media.php

Par exemple, vous pouvez _wp_get_image_size_from_meta pour obtenir les dimensions de l'image, vous n'avez donc pas besoin d'utiliser quelque chose comme ceci:

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

Pour obtenir les dimensions et le type d'image.

En revanche, on ne sait pas pourquoi ne pas utiliser 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: }

Vous pouvez définir le $crop sur true, et créez des miniatures au format 16: 9. Cela organise vos images à une taille particulière.

Vous pouvez ajouter plusieurs fois:

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

Et si possible, des miniatures seront créées, et comme vous le souhaitez.

Si vous travaillez avec image srcset attribut cela est pratique.

1
prosti