Hình chìm mờ hình ảnh với Wordpress với WP_Image_Editor


7

Tôi thực sự thích WP_Image_Editorlớp học. Tôi muốn sử dụng nó cho một số chức năng tùy chỉnh mà tôi đang tạo, nhưng tôi đã tự hỏi - Hình ảnh thủy ấn - có cách nào để tôi có thể sử dụng các đối tượng được tạo bằng cách WP_Image_Editorhợp nhất hình ảnh với hình mờ không? Tôi không thể tìm ra bất kỳ cách rõ ràng.

Câu trả lời:


3

Nếu bạn thực sự muốn sử dụng các lớp này, cách duy nhất là mở rộng cả các triển khai hiện có Wp_Image_Editor_ImagickWp_Image_Editor_GD.

Đây là một cách tiếp cận cho 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 );
    }
}

Việc thực hiện theo ví dụ này trên php.net .

Bây giờ bạn đã thực hiện, bạn phải thêm lớp mới vào ngăn xếp các trình chỉnh sửa ảnh có thể bằng bộ lọc 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;
} );

Bây giờ có thể có được một phiên bản trình soạn thảo tùy chỉnh của bạn khi gọi 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();
}

Bạn cũng có thể chỉ cần tạo ra ví dụ rõ ràng. Mọi khách hàng khác, sử dụng wp_get_image_editor()sẽ không nhận thức được phương thức stamp_watermark()nào.

Một số lưu ý quan trọng:

  • Mã này không được kiểm tra. Nó có nghĩa là cung cấp một cách tiếp cận đầu tiên về cách mở rộng Wp_Image_Editor_Gdlớp học.
  • Các ví dụ hiển thị cú pháp yêu cầu ít nhất PHP 5.5
  • Tất cả các nhiệm vụ về tải các tập tin cần thiết không được hiển thị. Sử dụng tải tự động thích hợp.
  • Tôi không tìm hiểu chi tiết về API GD. Vì vậy, tôi không chắc chắn về các loại mime được hỗ trợ, bạn nên kiểm tra điều này và thực hiện các phương pháp test()supportet_mime_types()theo điều này.

2

Tôi đã có rất nhiều vấn đề khi thực hiện mã David. Tôi đã gặp lỗi như không tìm thấy WP WP_IMAGE_EDITOR_GD, không tìm thấy được Vì vậy, tôi sẽ giải thích làm thế nào tôi có nó.

Đặt tất cả mã này vào một tệp php, của tôi được gọi là 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 ); }
}

Bây giờ, chúng ta cần đăng ký bộ lọc. Tôi đang sử dụng nó trong plugin riêng của mình, vì vậy tôi có mã này trên tệp plugin chính của mình, nhưng bạn cũng có thể đặt nó ở nơi khác như hàm.php. Lưu ý rằng tôi đang sử dụng allow_once để tải watermark.php, vì vậy watermark.php phải nằm trong cùng một thư mục.

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;
} );

Và bước cuối cùng, gọi đến tem_watermark (). Trong ví dụ này, tôi đang tải một hình ảnh từ đĩa, thay đổi kích thước của nó, đặt hình mờ và lưu nó. Lưu ý rằng tem_watermark () nhận được trên tham số đầu tiên, đường dẫn hoặc url của hình mờ, 2 tham số còn lại là lề tùy chọn.

$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); }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.