So fügen Sie mit add_image_size mehrere Bildgrößen derselben Größe hinzu

8

Ich verwende einen Graustufenfilter für alle hochgeladenen Bilder in meiner WordPress-Installation. Ich möchte jedoch sowohl das grau skalierte Bild als auch das farbige Bild auf meiner Website (farbig beim Schweben). Ich habe versucht, dies zu tun, indem ich eine Reihe von add_image_size () wie folgt erstellt habe:

add_image_size( 'gho-small', 100, 0, true ); // Used for small images
add_image_size( 'gho-small-grayscale', 100, 0, true ); // Used for small grayscaled images
add_image_size( 'gho-medium', 200, 0, true ); // Used for medium images
add_image_size( 'gho-medium-grayscale', 200, 0, true ); // Used for medium grayscaled images
add_image_size( 'gho-large', 400, 0, true ); // Used for large images
add_image_size( 'gho-large-grayscale', 400, 0, true ); // Used for large grayscaled images

Und dann würde ich einen Filter für die Bilder machen und nur die * -grayscale-IDs nehmen und sie speichern:

add_filter('wp_generate_attachment_metadata','gholumns_grayscale_filter');
function gholumns_grayscale_filter($meta)
{
    $dir = wp_upload_dir();
    $file = trailingslashit($dir['path']).$meta['sizes']['gho-large-grayscale']['file'];
    do_grayscale_filter($file);
    return $meta;
}

Es würde gut funktionieren, aber anscheinend betrachtet add_image_size () die Argumente width und height und wenn eine Größe bereits mit dieser Kombination definiert ist, wird die Größe nicht hinzugefügt. Ich kann das verstehen, da die Funktion darin besteht, neue Größen hinzuzufügen, und wenn die Größe ein Duplikat ist, ist es normalerweise besser, sie nicht erneut hinzuzufügen, um Verarbeitungszeit zu sparen. Aber jetzt möchte ich zwei Bilder mit der gleichen Größe, aber eines mit einem Filter und das andere mit dem Original.

Wie kann ich das erreichen?

Ich habe versucht, eine andere Größe hinzuzufügen, die nur ein Pixel breiter ist, wie:

add_image_size( 'gho-small-grayscale', 101, 0, true ); // Used for small grayscaled images

Und dann ändern Sie die Größe des Bildes später nach dem Filter wieder auf 100/200/400was auch immer. Aber es fühlt sich nicht richtig an und es bringt auch get_the_post_thumbnail()Anrufe durcheinander, da man immer noch denkt, dass die Bilddimension ist 101x$height. Es ist auch nicht so einfach, das Bild horizontal und vertikal um ein Pixel zu > 1pxverkleinern, da Verhältnisse dazu führen können, dass die Höhe höher ist, wenn Sie eine Breite + 1 Pixel haben.

Coen
quelle
Coen, du solltest deine Lösung als Antwort posten. Überprüfen Sie die FAQ und Sie werden sehen, dass es in Ordnung ist, Ihre eigenen Fragen zu beantworten.
Brasofilo
1
@brasofilo Ja, ich weiß, aber zu der Zeit hatte ich nicht genug Ruf, um meine eigene Frage innerhalb von 24 Stunden nach dem Posten zu beantworten. Normalerweise mache ich das, mach dir keine Sorgen.
Coen
Woops ... Zeit für mich, zu den FAQ zurückzukehren und diesen Reputationsteil zu lesen. Toller Beispielcode in Ihren Fragen und
Antworten

Antworten:

9

Ich löse ständig meine eigenen Probleme. Hier ist, wie ich es am Ende gelöst habe. Ich habe festgestellt, dass add_image_size nicht die identischen Abmessungen der Bildgröße ignoriert, sondern den Dateinamen auf dieselbe Datei im Upload-Verzeichnis verweist. Sobald ich das wusste, konnte ich das Graustufenbild einfach unter einem anderen Namen speichern, diesen Namen an das $ meta-Array in meinem Hook zurückgeben, und WP verwendet dies als Informationen, um es in der Datenbank zu speichern. Alle get_thumbnail () -Funktionen funktionieren immer noch wie sie sollten und ich kann einfach die -grayscale ID anfordern.

add_filter('wp_generate_attachment_metadata','gholumns_grayscale_filter');
function gholumns_grayscale_filter($meta)
{
$file = $meta['sizes']['gho-large-grayscale']['file'];
$meta['sizes']['gho-large-grayscale']['file'] = do_grayscale_filter($file);
//do_resize($file, -1, -1); # No longer necessary!
$file = $meta['sizes']['gho-medium-grayscale']['file'];
$meta['sizes']['gho-medium-grayscale']['file'] = do_grayscale_filter($file);
//do_resize($file, -1, -1); # No longer necessary!
$file = $meta['sizes']['gho-small-grayscale']['file'];
$meta['sizes']['gho-small-grayscale']['file'] = do_grayscale_filter($file);
//do_resize($file, -1, -1); # No longer necessary!
return $meta;
}


function do_grayscale_filter($file)
{
$dir = wp_upload_dir();
$image = wp_load_image(trailingslashit($dir['path']).$file);
imagefilter($image, IMG_FILTER_GRAYSCALE);
return save_modified_image($image, $file, '-grayscale');
}

function save_modified_image($image, $filename, $suffix)
{
$dir = wp_upload_dir();
$dest = trailingslashit($dir['path']).$filename;

list($orig_w, $orig_h, $orig_type) = @getimagesize($dest);

$filename = str_ireplace(array('.jpg', '.jpeg', '.gif', '.png'), array($suffix.'.jpg', $suffix.'.jpeg', $suffix.'.gif', $suffix.'.png'), $filename);
$dest = trailingslashit($dir['path']).$filename;

switch ($orig_type)
{
    case IMAGETYPE_GIF:
        imagegif( $image, $dest );
        break;
    case IMAGETYPE_PNG:
        imagepng( $image, $dest );
        break;
    case IMAGETYPE_JPEG:
        imagejpeg( $image, $dest );
        break;
}

return $filename;
}
Coen
quelle
Das ist großartig und genau das, was ich auch tun wollte, aber stattdessen mit einem Multiplikations-Effekt im Photoshop-Mischmodus. Ich hatte den Code, um ein normales rotes Bild aus einem anderen in normalem PHP erfolgreich zu erstellen, aber ich konnte nicht herausfinden, wie ich es auf alle aktuellen Bildgrößen anwenden kann.
Mike Kormendy
Eine Sache, die mir aufgefallen ist, war, dass dies für Bildregeneratoren und Bilder, die im aktuellen Monat nicht für Beiträge gespeichert wurden, nicht ganz funktioniert.
Mike Kormendy