¿Cómo puedo hacer un recorte add_image_size () desde la parte superior?

19

Tengo una serie de publicaciones, todas con imágenes destacadas, pero necesito poder personalizar la esquina superior derecha del recorte. En este caso, necesito que se recorten desde la parte superior derecha, pero también sería útil saber cómo posicionar ese punto.

En la actualidad, la función add_image_size () está tomando su recorte desde el centro de la imagen. ¡No siempre guapa!

    
pregunta Mild Fuzz 24.06.2011 - 11:11

5 respuestas

13

La generación de imágenes intermedias es extremadamente rígida. image_resize() lo mantiene cerca del código y carece por completo de ganchos.

Una opción prácticamente única para esto es enganchar en wp_generate_attachment_metadata y sobrescribir la imagen generada por WP con la suya (que necesitará un poco de image_resize() fork).

Necesito esto para trabajar, por lo que podría compartir algo de código más adelante.

Ok, aquí está el ejemplo, pero funciona. Tenga en cuenta que configurar el recorte de esta manera requiere comprender 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;
}
    
respondido por el Rarst 24.06.2011 - 11:28
9

El códice de Wordpress tiene la respuesta, está debajo.

  

Establezca el tamaño de la imagen recortando la imagen y definiendo una posición de recorte:

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

Al establecer una posición de recorte, el primer valor de la matriz es el x   Posición del recorte del eje, la segunda es la posición del recorte del eje y.

     

x_crop_position acepta 'izquierda' 'centro' o 'derecha'. y_crop_position   acepta 'superior', 'centro' o 'inferior'. Por defecto, estos valores por defecto.   para 'centrar' cuando se usa el modo de recorte duro.

Y también el códice hace referencia a una página que muestra cómo actúan las posiciones de los cultivos.

  

enlace

    
respondido por el ewroman 04.02.2015 - 16:29
7

He desarrollado una solución a este problema que no requiere hackear el núcleo: enlace

También he enviado un parche al núcleo: enlace

Agregue usted mismo como un Cc en el ticket para mostrar su soporte para que se agregue al núcleo.

    
respondido por el bradt 19.02.2012 - 15:37
3

Puede utilizar el complemento Posición de recorte de miniaturas para seleccionar la posición de recorte de sus miniaturas.

    
respondido por el PoseLab 10.01.2013 - 14:13
0

Solución alternativa aquí: enlace

Simplemente agregue este código a functions.php, luego use el complemento "Regenerar miniaturas" ( enlace ):

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 );
    
respondido por el Niente0 27.04.2016 - 10:36

Lea otras preguntas en las etiquetas