Come posso fare add_image_size () ritagliare dall'alto?


20

Ho una serie di post, tutti con immagini in primo piano, ma devo essere in grado di personalizzare il ritaglio nell'angolo in alto a destra. In questo caso, ho bisogno che vengano ritagliati in alto a destra, ma sarebbe utile anche sapere come posizionare quel punto da solo.

Al momento, la funzione add_image_size () sta prendendo il suo ritaglio dal centro dell'immagine. Non sempre carino !!

Risposte:


13

La generazione di immagini intermedie è estremamente rigida. image_resize()lo tiene vicino al codice e manca completamente di hook.

Praticamente l'unica opzione per questo è agganciare wp_generate_attachment_metadatae sovrascrivere l'immagine generata da WP con la tua (che avrà bisogno di un po 'di image_resize()fork).

Ho bisogno di questo per lavoro, quindi potrei essere in grado di condividere un po 'di codice in seguito.

Ok, ecco un esempio approssimativo, ma funzionante. Si noti che l'impostazione del raccolto in questo modo richiede comprensione 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
suona molto come fare casino con il core !!
Lieve Fuzz,

5
No, pasticciare con il core cambierebbe la image_resizefunzione. Il primo è stato il punto che avresti dovuto agganciare al processo di ridimensionamento, ma creare manualmente le dimensioni dell'immagine.
TheDeadMedic,

Posso chiederti se funziona ancora? Ho appena implementato l'hook nel mio file Functions.php e ho impostato le funzioni add_image_size (), ma le immagini ritagliate vengono comunque ritagliate al centro.
cr0z3r,

@ cr0z3r Non conosco alcun motivo per cui non funzionerà. Ma si noti che questo è solo un esempio approssimativo di prova di concetto, piuttosto che un codice affidabile significativo.
Rarst

Stranamente, non funziona sul mio tema - potrebbe essere perché stavo correndo localmente (ne dubito fortemente)? Lo avrò online e te lo mostrerò presto.
cr0z3r,

13

Il codice Wordpress ha la risposta, è sotto.

Imposta le dimensioni dell'immagine ritagliando l'immagine e definendo una posizione di ritaglio:

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

Quando si imposta una posizione di ritaglio, il primo valore nell'array è la posizione di ritaglio dell'asse x, il secondo è la posizione di ritaglio dell'asse y.

x_crop_position accetta 'left' 'center' o 'right'. y_crop_position accetta 'top', 'center' o 'bottom'. Per impostazione predefinita, questi valori predefiniti sono "centrati" quando si utilizza la modalità ritaglio.

Inoltre, il codice fa riferimento a una pagina che mostra come agiscono le posizioni delle colture.

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


Questo è fantastico, dovrebbe essere la risposta accettata, penso!
Dalton,

7

Ho sviluppato una soluzione a questo problema che non richiede l'hacking del core: http://bradt.ca/archives/image-crop-position-in-wordpress/

Ho anche inviato una patch al core: http://core.trac.wordpress.org/ticket/19393

Aggiungi te stesso come Cc sul ticket per mostrare il tuo supporto affinché venga aggiunto al core.


2
La soluzione di @ Rarst non cambia anche i file core. ;)
fuxia

1
@toscho Immagino che non intendesse dire che l'altra risposta cambia il codice di base.
Kaiser


0

Soluzione alternativa qui: http://pixert.com/blog/cropping-post-featured-thumbnails-from-top-instead-of-center-in-wordpress-with-native-cropping-tool/

Basta aggiungere questo codice a Functions.php, quindi utilizzare il plug-in "Rigenera miniature" ( 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 );

Ciao Niente0, benvenuto in WPSE e grazie per la tua risposta. Ti dispiacerebbe modificare il tuo post per spiegare cosa fa il tuo codice? I post sui siti StackExchange dovrebbero spiegare la loro soluzione e includere solo collegamenti fuori sede come riferimenti, non come intere soluzioni. Grazie ancora!
Tim Malone,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.