¿Cómo puedo hacer un recorte add_image_size () desde arriba?

20

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 sería útil saber cómo posicionar ese punto yo mismo.

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

Fuzz suave
fuente

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.

Prácticamente la única opción para esto es conectar wp_generate_attachment_metadatay sobrescribir la imagen generada por WP con la suya (que necesitará un poco de image_resize()bifurcación).

Necesito esto para el trabajo, así que podría compartir algún código más tarde.

Ok, este es un ejemplo tosco pero funcional. Tenga en cuenta que configurar el cultivo 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;
}
Rarst
fuente
1
suena mucho como jugar con el núcleo !!
Mild Fuzz
55
No, jugar con el núcleo estaría cambiando la image_resizefunción. Rarst estaba señalando que tendría que engancharse en el proceso de cambio de tamaño, pero cree los tamaños de imagen usted mismo manualmente.
TheDeadMedic
¿Puedo preguntar si esto todavía funciona? Acabo de implementar el gancho en mi archivo functions.php y tengo la configuración de funciones add_image_size (), pero las imágenes recortadas aún se recortan del centro.
cr0z3r
@ cr0z3r No sé por qué no funcionará. Pero tenga en cuenta que este es solo un ejemplo aproximado de prueba de concepto, en lugar de un código confiable significativo.
Rarst
Hm, curiosamente, no funciona en mi tema, ¿podría ser porque estaba corriendo localmente (lo dudo mucho)? Lo tendré en línea y se lo mostraré pronto.
cr0z3r
13

Wordpress codex tiene la respuesta, está abajo.

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 en la matriz es la posición de recorte del eje x, el segundo es la posición de recorte del eje y.

x_crop_position acepta 'left' 'center' o 'right'. y_crop_position acepta 'top', 'center' o 'bottom'. De manera predeterminada, estos valores predeterminan '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 recorte.

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

ewroman
fuente
¡Esto es increíble, creo que debería ser la respuesta aceptada!
Dalton
3

Puede usar el complemento Posición de recorte de miniaturas para seleccionar la posición de recorte de las miniaturas.

PoseLab
fuente
0

Solución alternativa aquí: http://pixert.com/blog/cropping-post-featured-thumbnails-from-top-instead-of-center-in-wordpress-with-native-cropping-tool/

Simplemente agregue este código a functions.php, luego use el complemento "Regenerar miniaturas" ( 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
fuente
Hola Niente0, bienvenido a WPSE y gracias por tu respuesta. ¿Te importaría editar tu publicación para explicar qué hace tu código? Las publicaciones en los sitios de StackExchange deben explicar su solución y solo incluir enlaces externos como referencias, no como soluciones completas. ¡Gracias de nuevo!
Tim Malone