Wasserzeichen für Bilder mit Wordpress mit WP_Image_Editor

7

Ich mag die WP_Image_EditorKlasse wirklich . Ich wollte es für einige benutzerdefinierte Funktionen verwenden, die ich mache, aber ich habe mich gefragt - Wasserzeichenbilder - gibt es eine Möglichkeit, die von erstellten Objekte WP_Image_Editorzum Zusammenführen eines Bildes mit einem Wasserzeichen zu verwenden? Ich kann keinen offensichtlichen Weg finden.

user1915665
quelle

Antworten:

3

Wenn Sie wirklich verwenden wollen würde diese Klassen die einzige Möglichkeit , sowohl bestehende Implementierungen zu erweitern sein Wp_Image_Editor_Imagickund Wp_Image_Editor_GD.

Hier ist ein Ansatz für Wp_Image_Editor_GD:

namespace WPSE98156;

use
    Wp_Image_Editor_Gd,
    Wp_Error;

class WatermarkImageEditor extends Wp_Image_Editor_Gd {

    /*
     * @param resource $stamp (A GD image resource)
     *
     * @return bool|WP_Error
     */
    public function stamp_watermark( $stamp ) {

        /**
         * The resource of the image to edit is stored in
         * $this->image, after $this->load() was called
         */
        $loaded = $this->load();
        if ( is_wp_error( $loaded ) )
            return $loaded;

        // Set the margins for the stamp and get the height/width of the stamp image
        $marge_right = 10;
        $marge_bottom = 10;
        $sx = imagesx( $stamp );
        $sy = imagesy( $stamp );

        // Copy the stamp image onto our photo using the margin offsets and the photo
        // width to calculate positioning of the stamp.
        imagecopy(
            $this->image,
            $stamp,
            imagesx( $this->image ) - $sx - $marge_right,
            imagesy( $this->image ) - $sy - $marge_bottom,
            0,
            0,
            imagesx( $stamp ),
            imagesy( $stamp )
        );
    }

    /**
     * @param array $args
     *
     * @return bool
     */
    public static function test( $args = [] ) {

        /**
         * Maybe implement your own test here, whether the environment
         * is able to deal with your implementation of the
         * stamp_watermark() method
         */
        return parent::test( $args );
    }

    /**
     * @param string $mime_type
     *
     * @return bool
     */
    public static function supports_mime_type( $mime_type ) {

        /**
         * Todo: Check here if the implementation of the method stamp_watermark()
         * can deal with the mime-types image/png, image/jpeg and image/gif
         */
        return parent::supports_mime_type( $mime_type );
    }
}

Die Implementierung folgt diesem Beispiel auf php.net .

Nachdem Sie Ihre Implementierung abgeschlossen haben, müssen Sie die neue Klasse mithilfe des Filters zum Stapel möglicher Bildeditoren hinzufügen wp_image_editors:

namespace WPSE98156;

add_filter( 'wp_image_editors', function( $editors ) {

    if ( ! is_array( $editors ) )
        return $editors; //someone broke the filtered value

    array_unshift( $editors, WatermarkImageEditor::class );

    return $editors;
} );

Jetzt ist es wahrscheinlich möglich, eine Instanz Ihres benutzerdefinierten Editors abzurufen, wenn Sie Folgendes aufrufen wp_get_image_editor():

$editor = wp_get_image_editor( '/path/to/image.jpeg' );
if ( ! is_wp_error( $editor ) && is_callable( [ $editor, 'stamp_watermark' ] ) && ! is_wp_error( $loaded ) ) {

    $stamp = imagecreatefrompng( '/path/to/watermark.png' );
    $success = $editor->stamp_watermark( $stamp );
    if ( ! is_wp_error( $success ) )
        $editor->save();
}

Sie können die Instanz auch einfach explizit erstellen. Jeder andere Client, der verwendet wp_get_image_editor(), kennt die Methode stamp_watermark()sowieso nicht.

Einige wichtige Hinweise:

  • Der Code wird nicht getestet. Es soll einen ersten Ansatz zur Erweiterung der Wp_Image_Editor_GdKlasse bieten .
  • Die Beispiele zeigen eine Syntax, die mindestens PHP 5.5 erfordert
  • Alle Aufgaben zum Laden der erforderlichen Dateien werden nicht angezeigt. Verwenden Sie das richtige automatische Laden.
  • Ich bin nicht in die Details der GD-API. Ich bin mir also nicht sicher, welche MIME-Typen unterstützt werden. Sie sollten dies testen und die Methoden implementieren test()und supportet_mime_types()entsprechend.
David
quelle
2

Ich hatte viele Probleme bei der Implementierung von David-Code. Ich hatte Fehler wie "WP_IMAGE_EDITOR_GD" nicht gefunden, "WatermarkImageEditor" nicht gefunden ... Und als ich es zum Laufen brachte, funktionierte es nicht mit Alpha-Kanal-PNG, so dass ich viele Stunden verloren habe, damit es mit ihnen funktioniert. Also werde ich erklären, wie ich es habe.

Fügen Sie all diesen Code in eine PHP-Datei ein, meine heißt watermark.php.

<?php
class WatermarkImageEditor extends WP_Image_Editor_GD {
    public function stamp_watermark( $stampPath, $marginH=0, $marginV=0 ) {
        $loaded = $this->load();
        if ( is_wp_error( $loaded ) ) return $loaded;

        $stamp=imagecreatefrompng( $stampPath );
        if(is_wp_error($stamp)){ return $stamp; }
        imagealphablending($stamp, true);

        $sx = imagesx( $stamp );
        $sy = imagesy( $stamp );
        imagealphablending($this->image, true);
        imagecopy(
            $this->image, $stamp,$marginH,$this->size['height']-$sy-$marginV,0,0,$sx, $sy
        );  
    }

    public static function test( $args = [] ) { return parent::test( $args ); }

    public static function supports_mime_type( $mime_type ) { return parent::supports_mime_type( $mime_type ); }
}

Jetzt müssen wir den Filter registrieren. Ich verwende es in meinem eigenen Plugin, daher habe ich diesen Code in meiner Haupt-Plugin-Datei, aber Sie können ihn auch an einer anderen Stelle wie functions.php ablegen. Beachten Sie, dass ich require_once verwende, um watermark.php zu laden, daher muss sich watermark.php im selben Ordner befinden.

add_filter( 'wp_image_editors', function( $editors ) {
    require_once __DIR__. '/watermark.php';
    if ( ! is_array( $editors ) )
        return $editors; //someone broke the filtered value
    array_unshift( $editors, "WatermarkImageEditor");
    return $editors;
} );

Rufen Sie im letzten Schritt stamp_watermark () auf. In diesem Beispiel lade ich ein Bild von der Festplatte, ändere die Größe, setze das Wasserzeichen und speichere es. Beachten Sie, dass stamp_watermark () für den ersten Parameter den Pfad oder die URL des Wasserzeichens empfängt. Die anderen beiden Parameter sind der optionale Rand.

$editor= wp_get_image_editor($imagePath);
$editor->resize(1920, 1080, TRUE);
if(is_callable([$editor,'stamp_watermark'])){
  $success = $editor->stamp_watermark( ABSPATH.'wp-content/uploads/watermark-full.png', 20, 20 );       
  if(!is_wp_error($success)){ $editor->save($imagePath); }
}
CarlosBC
quelle