চিত্রের আকারের উপর ভিত্তি করে চিত্রের গুণমান


15

চিত্রের আকারের উপর নির্ভর করে কি চিত্রের মান সেট করা সম্ভব? আমি বৃহত্তর চিত্রগুলির (80) - এবং আরও ছোট থাম্বনেইলের (30) এর চেয়ে আরও খারাপ চিত্রের মানের থাকতে চাই।

আমি এটি add_sizeনিয়ন্ত্রণ করার জন্য একটি প্যারামিটার আশা করছিলাম - তবে কিছুই নেই।

যদি এটি গুরুত্বপূর্ণ হয়: আমি ইমেজম্যাগিক ব্যবহার করছি।

উত্তর:


15

চিত্রটি সংরক্ষণ বা স্ট্রিম করার আগে (সম্পাদকের জন্য) মানসম্মত বিষয়টিকে নির্ধারণের একমাত্র সময় সঠিক। এই উভয়েরই সেখানে "চিত্র_শক্তি__সেভ_প্রিয়ার" ফিল্টার রয়েছে, এটি চিত্র সম্পাদকের উদাহরণটি পেরিয়ে যায়। সুতরাং আপনি মানটি নির্ধারণ সহ চিত্রটিকে যে কোনও উপায়ে পরিবর্তন করতে এটি ব্যবহার করতে পারেন।

সুতরাং, এই জাতীয় কোনও কাজটি সহজ এবং সহজেই করা উচিত:

add_filter('image_editor_save_pre','example_adjust_quality');
function example_adjust_quality($image) {
    $size = $image->get_size();
    // Values are $size['width'] and $size['height']. Based on those, do what you like. Example:
    if ( $size['width'] <= 100 ) {
        $image->set_quality(30);
    }
    if ( $size['width'] > 100 && $size['width'] <= 300 ) {
        $image->set_quality(70);
    }
    if ( $size['width'] > 300 ) {
        $image->set_quality(80);
    }
    return $image;
}

আমি কেন এটির মতো কিছু সোজা ব্যবহার করতে পারি নি তার কারণ (+1), আমি অস্পষ্টভাবে মনে রেখেছি যে কোনও চিত্র সম্পাদনা করার সময় (ঘোরানো, ক্রপিং ইত্যাদি), প্রতিটি ক্রিয়াকে দু'বার ডেকে আনা হয়েছিল, গুণটি দু'বার কমিয়ে দেওয়া হয়েছিল। তবুও WP_Image_Editor"অংশের উদাহরণ " অংশটি আমি যা লিখেছি তার চেয়ে অনেক বেশি সমাধানের সমাধান।
কায়সার

1
গুণমান একটি সঠিক মান, শতাংশ নয়। এটি সংরক্ষণ না করা অবধি আপনি নিজের পছন্দ মতো সব সেট করে সেট করে সেট করতে পারেন। এটিকে একশ বার সেট করা 10 এ ছেড়ে যায়
অটো

আমি ধরেছিলাম এটি এর মধ্যে সাশ্রয় করবে। সতর্ক থাকুন জন্য ধন্যবাদ।
কায়সার

এটি আমার কাছে মনে হয় না যে image_editor_save_preডাকেনি। যখন আমি স্টাটপ আউটপুট ব্যবহার করে চেষ্টা করি error_log(যা অবশ্যই কাজ করে) আমি কোনও আউটপুট পাই না। : /
নীল রিডেমেন

1
পুনরায় জেনারেট করা খুব কার্যকর হতে পারে, যদি এটি চিত্রটি পুনঃনির্মাণ করে। কোনও কোডই সিস্টেমে বিদ্যমান ফাইলগুলিকে পরিবর্তন করে যাচ্ছে না কারণ আপনি তাদের পুনরায় লোড এবং পুনঃব্যাবস্থাপনের জন্য প্রকৃতপক্ষে পদক্ষেপ নিচ্ছেন না।
অটো

5

অগ্রণীত দ্রষ্টব্য: নীচের উত্তরটি শেষ হয়নি এবং এটি পরীক্ষা করা হয়নি তবে আমার যথেষ্ট সময় বাকি নেই, সুতরাং আমি এটিকে খসড়া হিসাবে এখানে রেখে দেব। যা সম্ভবত দ্বিতীয় জোড়া চোখের প্রয়োজন তা হ'ল মানের পদ্ধতি এবং এর ব্যাখ্যা version_compare()

প্রথমে আমাদের একটি এন্ট্রি পয়েন্ট দরকার। আবার মেক পোস্টটি পড়ার পরে , আমি ভাবলাম ইমেজ এডিটর সদ্য তৈরি হওয়া চিত্রটি সংরক্ষণ করার আগে লাফিয়ে যাওয়াই ভাল। সুতরাং এখানে একটি মাইক্রো কন্ট্রোলার যা কলব্যাকের সময় বাধা দেয় image_editor_save_preএবং এমন একটি শ্রেণি লোড করে যা কলব্যাকের অভ্যন্তরে সংজ্ঞায়িত আপনার সেটিংসের মধ্য দিয়ে যায় wpse_jpeg_quality। এটি সহজেই jpeg_qualityফিল্টারটির জন্য বিভিন্ন সংক্ষেপণের অনুপাত দেয় যা চিত্র সম্পাদকের অভ্যন্তরে চলে runs

<?php

namespace WPSE;

/**
 * Plugin Name: (#138751) JPEG Quality Router
 * Author:      Franz Josef Kaiser
 * Author URI:  http://unserkaiser.com
 * License:     CC-BY-SA 2.5
 */

add_filter( 'image_editor_save_pre', 'WPSE\JPEGQualityController', 20, 2 );
/**
 * @param string $image
 * @param int $post_id
 * @return string
 */
function JPEGQualityController( $image, $post_id )
{
    $config = apply_filters( 'wpse_jpeg_quality', array(
        # Valid: <, lt, <=, le, >, gt, >=, ge, ==, =, eq
        'limit'      => 'gt',
        # Valid: h, w
        'reference'  => 'w',
        'breakpoint' => 50,

        'low'        => 80,
        'high'       => 100,
    ) );
    include_once plugin_dir_path( __FILE__ ).'worker.php';
    new \WPSE\JPEGQualityWorker( $image, $config );

    return $image;
}

আসল কর্মী হ'ল JPEGQualityWorkerক্লাস। এটি উপরের মূল প্লাগইন ফাইলের মতো একই ডিরেক্টরিতে অবস্থান করে এবং নামকরণ করা হয় worker.php(বা আপনি উপরের নিয়ামকটি পরিবর্তন করেন)।

এটি চিত্র এবং আপনার সেটিংস পুনরুদ্ধার করে এবং তারপরে jpeg_qualityফিল্টারটিতে কলব্যাক যোগ করে । যা হয় তা হচ্ছে

  • আপনার চিত্রের রেফারেন্স পুনরুদ্ধার করা (প্রস্থ বা উচ্চতা)
  • আপনার ব্রেকপয়েন্টকে প্রশ্নবিদ্ধ করছে যা নিম্ন এবং উচ্চ মানের / সংক্ষেপণের অনুপাতের মধ্যে কোথায় স্যুইচ করবে তা স্থির করে
  • মূল চিত্রের আকার পুনরুদ্ধার করা হচ্ছে
  • কোন গুণটি ফিরবে তা স্থির করে

ব্রেকপয়েন্ট এবং সীমাটি উচ্চ এবং নিম্নের মধ্যে কী সিদ্ধান্ত নেয় এবং এটি উপরে উল্লিখিত হিসাবে আরও কিছু ভালবাসার প্রয়োজন হতে পারে।

<?php

namespace WPSE;

/**
 * Class JPEGQualityWorker
 * @package WPSE
 */
class JPEGQualityWorker
{
    protected $config, $image;
    /**
     * @param string $image
     * @param array $config
     */
    public function __construct( Array $config, $image )
    {
        $this->config = $config;
        $this->image  = $image;

        add_filter( 'jpeg_quality', array( $this, 'setQuality' ), 20, 2 );
    }

    /**
     * Return the JPEG compression ratio.
     *
     * Avoids running in multiple context, as WP runs the function multiple
     * times per resize/upload/edit task, which leads to over compressed images.
     *
     * @param int $compression
     * @param string $context Context: edit_image/image_resize/wp_crop_image
     * @return int
     */
    public function setQuality( $compression, $context )
    {
        if ( in_array( $context, array(
            'edit_image',
            'wp_crop_image',
        ) ) )
            return 100;

        $c = $this->getCompression( $this->config, $this->image );

        return ! is_wp_error( $c )
            ? $c
            : 100;
    }

    /**
     * @param array $config
     * @param string $image
     * @return int|string|\WP_Error
     */
    public function getCompression( Array $config, $image )
    {
        $reference = $this->getReference( $config );
        if ( is_wp_error( $reference ) )
            return $reference;
        $size = $this->getOriginalSize( $image, $reference );
        if ( is_wp_error( $size ) )
            return $size;

        return $this->getQuality( $config, $size );
    }

    /**
     * Returns the quality set for the current image size.
     * If
     * @param array $config
     * @param int $size
     */
    protected function getQuality( Array $config, $size )
    {
        $result = version_compare( $config['breakpoint'], $size );
        return (
            0 === $result
            AND in_array( $config['limit'], array( '>', 'gt', '>=', 'ge', '==', '=', 'eq' ) )
            ||
            1 === $result
            AND in_array( $config['limit'], array( '<', 'lt', '<=', 'le', ) )
        )
            ? $config['high']
            : $config['low'];
    }

    /**
     * Returns the reference size (width or height).
     *
     * @param array $config
     * @return string|\WP_Error
     */
    protected function getReference( Array $config )
    {
        $r = $config['reference'];
        return ! in_array( $r, array( 'w', 'h', ) )
            ? new \WP_Error(
                'wrong-arg',
                sprintf( 'Wrong argument for "reference" in %s', __METHOD__ )
            )
            : $r;
    }

    /**
     * Returns the size of the original image (width or height)
     * depending on the reference.
     *
     * @param string $image
     * @param string $reference
     * @return int|\WP_Error
     */
    protected function getOriginalSize( $image, $reference )
    {
        $size = 'h' === $reference
            ? imagesy( $image )
            : imagesx( $image );

        # @TODO Maybe check is_resource() to see if we got an image
        # @TODO Maybe check get_resource_type() for a valid image
        # @link http://www.php.net/manual/en/resource.php

        return ! $size
            ? new \WP_Error(
                'image-failure',
                sprintf( 'Resource failed in %s', get_class( $this ) )
            )
            : $size;
    }
}

এটির উপর এখনও কাজ করতেছি? যতদূর আমি উদ্বিগ্ন আমি প্লাগইন হিসাবে এটি দেখতে পছন্দ করব।
নীলস রিডেম্যান ২

দুঃখিত, তবে আমি না। আমি এটি দেখতে চাই যে প্লাগইনটিও পাশাপাশি, তবে বর্তমানে আমার এটির দরকার নেই এবং সময় নেই, এটি এখন পর্যন্ত ঘটবে না। সম্ভবত এটি একটি শট দিন, দেখুন আপনি কতদূর পান এবং একটি সম্পাদনা বা পৃথক উত্তর দায়ের করেন ? :)
কায়সার

কায়সার: আপনি এটি অত্যধিক জটিল, আমি মনে করি। _ চিত্রটি_ইডিটর_সেভ_প্রেমে প্রেরণ করা ডাব্লুপি_আইমেজ_এডিটর শ্রেণীর উদাহরণ। আকারটি পেতে এবং এর মধ্যে ইতিমধ্যে মান এবং অন্যান্য সমস্ত কিছু নির্ধারণ করার জন্য এটির ফাংশন রয়েছে। আপনাকে যা করতে হবে তা হল তাদের কল করা।
অটো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.