Cum pot face ca add_image_size() să taie imaginea din partea de sus?

24 iun. 2011, 12:11:17
Vizualizări: 18.2K
Voturi: 21

Am o serie de articole, toate cu imagini reprezentative, dar trebuie să pot personaliza tăierea din colțul dreapta-sus. În acest caz, am nevoie ca imaginile să fie tăiate din partea dreapta-sus, dar ar fi util să știu și cum să pozitionez acel punct manual.

În prezent, funcția add_image_size() face tăierea din centrul imaginii. Nu întotdeauna arată bine!!

0
Toate răspunsurile la întrebare 5
1
19

Wordpress codex are răspunsul, este mai jos.

Stabilește dimensiunea imaginii prin tăierea acesteia și definirea unei poziții de tăiere:

add_image_size( 'custom-size', 220, 220, array( 'left', 'top' ) ); // Tăiere dură în stânga sus

Când setezi o poziție de tăiere, prima valoare din array reprezintă poziția de tăiere pe axa x, iar a doua pe axa y.

x_crop_position acceptă 'left', 'center' sau 'right'. y_crop_position acceptă 'top', 'center' sau 'bottom'. În mod implicit, aceste valori sunt setate la 'center' când folosești modul de tăiere dură.

De asemenea, codex face referire la o pagină care arată cum acționează pozițiile de tăiere.

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

4 feb. 2015 17:29:43
Comentarii

Acest lucru este minunat, ar trebui să fie răspunsul acceptat, cred!

Dalton Rooney Dalton Rooney
8 nov. 2015 22:57:06
5
13

Generarea imaginilor intermediare este extrem de rigidă. Funcția image_resize() o ține strâns legată de cod și nu oferă suficiente puncte de conectare (hooks).

Practic, singura opțiune pentru aceasta este să te conectezi la wp_generate_attachment_metadata și să suprascrii imaginea generată de WordPress cu una proprie (care va necesita o mică modificare a funcției image_resize()).

Am nevoie de asta pentru muncă, așa că s-ar putea să pot împărtăși niște cod mai târziu.

Ok, iată un exemplu aproximativ, dar funcțional. Reține că configurarea crop-ului în acest fel necesită înțelegerea funcției imagecopyresampled().

add_filter('wp_generate_attachment_metadata', 'custom_crop');

function custom_crop($metadata) {

    $uploads = wp_upload_dir();
    $file = path_join( $uploads['basedir'], $metadata['file'] ); // fișierul original al imaginii
    list( $year, $month ) = explode( '/', $metadata['file'] );
    $target = path_join( $uploads['basedir'], "{$year}/{$month}/".$metadata['sizes']['medium']['file'] ); // fișierul cu dimensiunea intermediară
    $image = imagecreatefromjpeg($file); // resursa imaginii originale
    $image_target = wp_imagecreatetruecolor( 44, 44 ); // imagine goală de completat
    imagecopyresampled($image_target, $image, 0, 0, 25, 15, 44, 44, 170, 170); // decupare din original
    imagejpeg($image_target, $target, apply_filters( 'jpeg_quality', 90, 'image_resize' )); // scrie imaginea decupată în fișier

    return $metadata;
}
24 iun. 2011 12:28:13
Comentarii

sună foarte mult ca un lucru cu nucleul!!

Mild Fuzz Mild Fuzz
24 iun. 2011 12:35:36

Nu, a lucra cu nucleul ar însemna să modifici funcția image_resize. Rarst sublinia că ar trebui să te conectezi la procesul de redimensionare, dar să creezi manual dimensiunile imaginilor.

TheDeadMedic TheDeadMedic
24 iun. 2011 13:02:29

Pot întreba dacă acest lucru încă funcționează? Tocmai am implementat hook-ul în fișierul meu functions.php și am setat funcții add_image_size(), dar imaginile tăiate încă sunt tăiate din centru spre exterior.

cr0z3r cr0z3r
10 dec. 2011 00:40:13

@cr0z3r Nu știu niciun motiv pentru care nu ar funcționa. Dar reține că acesta este doar un exemplu aproximativ de concept-dovadă, mai degrabă decât un cod semnificativ și de încredere.

Rarst Rarst
10 dec. 2011 15:50:44

Hm, ciudat este că nu funcționează pe tema mea - ar putea fi din cauză că rulez local (mă îndoiesc foarte tare)? O voi pune online și ți-l voi arăta în curând.

cr0z3r cr0z3r
15 dec. 2011 18:32:03
2

Am dezvoltat o soluție pentru această problemă care nu necesită modificarea nucleului WordPress: http://bradt.ca/archives/image-crop-position-in-wordpress/

De asemenea, am trimis un patch pentru nucleu: http://core.trac.wordpress.org/ticket/19393

Adaugă-te ca Cc (Carbon copy) pe ticket pentru a-ți arăta susținerea pentru includerea acestei funcționalități în nucleul WordPress.

19 feb. 2012 16:37:47
Comentarii

Soluția lui @Rarst nu modifică nici fișierele de bază. ;)

fuxia fuxia
19 feb. 2012 17:25:36

@toscho Cred că nu a vrut să spună că celălalt răspuns modifică codul de bază.

kaiser kaiser
20 feb. 2012 17:16:48
0

Puteți utiliza pluginul Thumbnail Crop Position pentru a selecta poziția de decupare a miniaturilor dumneavoastră.

10 ian. 2013 15:13:37
1

Soluție alternativă aici: http://pixert.com/blog/cropping-post-featured-thumbnails-from-top-instead-of-center-in-wordpress-with-native-cropping-tool/

Adăugați acest cod în functions.php, apoi utilizați plugin-ul "Regenerate Thumbnails" (https://wordpress.org/plugins/regenerate-thumbnails/):

function px_image_resize_dimensions( $payload, $orig_w, $orig_h, $dest_w, $dest_h, $crop ){

// Schimbați aceasta cu o condiție care decide dacă doriți să suprascrieți valorile implicite pentru această imagine sau nu.
if( false )
return $payload;

if ( $crop ) {
// decuparea celei mai mari porțiuni posibile din imaginea originală pe care o putem redimensiona la $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; // [[ anterior ]] ==> floor( ($orig_w - $crop_w) / 2 );
$s_y = 0; // [[ anterior ]] ==> floor( ($orig_h - $crop_h) / 2 );
} else {
// nu decupați, doar redimensionați utilizând $dest_w x $dest_h ca limită maximă
$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 );
}

// dacă imaginea rezultată ar fi de aceeași dimensiune sau mai mare, nu dorim să o redimensionăm
if ( $new_w >= $orig_w && $new_h >= $orig_h )
return false;

// array-ul returnat corespunde parametrilor pentru 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 );
27 apr. 2016 11:36:02
Comentarii

Salut Niente0, bun venit pe WPSE și mulțumim pentru răspunsul tău. Ai putea să editezi postarea ta pentru a explica ce face codul tău? Postările pe site-urile StackExchange ar trebui să explice soluția oferită și să includă link-uri externe doar ca referințe, nu ca soluții întregi. Mulțumim din nou!

Tim Malone Tim Malone
27 apr. 2016 12:52:08