سؤال

أحاول التوصل إلى حل حيث ولدت صيغ الصور تغطي كل استجابة عالية الدقة الجوانب عند تحميل عنصر جديد في الفسفور الابيض الادارية.لقد وضعنا معا مجموعة من الأشكال التي يجب أن تلبي هذه المتطلبات ،

2560 x 1600 الشبكية سطح المكتب ('largex2', حسب الطلب)
1280 × 800 سطح المكتب (كبير)
1920 × 1200 الشبكية قرص ('mediumx2', حسب الطلب)
960 × 600 قرص + الشبكية النقالة (متوسطة)
480 x 300 المحمول (صورة مصغرة)

مشكلتي تكمن في جودة الصورة على أحجام أكبر.تصدير الصور من فوتوشوب في إعداد جودة عالية أو عالية جدا سوف تنتج نتائج عادلة الافتراضي الأحجام ، ولكن ماذا عن العرف منها ؟ تلك وأود أن بدلا من التصدير أو متوسطة أو منخفضة وضع للحفاظ على معقول حجم الملف.

فكرتي هي - هل من الممكن أن تأخذ واحدة كبيرة حقا صورة عالية الجودة, تحميله, ثم تعيين بحيث أحجام أكبر تتولد في أقل بكثير من الجودة ؟

أي مساعدة هي موضع تقدير!من فضلك لا يرشدني إلى أي الإضافات, أريد أن أبني بلدي حل لهذا.

هل كانت مفيدة؟

المحلول

1) الحل من خلال توسيع WP_Image_Editor_GD الدرجة

المشكلة هي كيفية الوصول إلى أحجام الصور قبل تغيير الجودة المتوسطة jpeg الصور.

علما بأن image_resize() وظيفة إهمال.

يمكننا استخدام jpeg_quality مرشح من الجمهور get_quality طريقة مجردة ، WP_Image_Editor الدرجة:

$quality = apply_filters( 'jpeg_quality', $quality, 'image_resize' );

أو wp_editor_set_quality مرشح.

هنا واحد فكرة عن كيفية تعيين جودة الصورة على أساس حجم الصورة (عرض/ارتفاع):

/**
 * Set image (jpeg) quality based on the image size (width/height)
 * @see http://wordpress.stackexchange.com/a/165241/26350
 */
add_filter( 'wpse_make_image_arguments', function( $arguments, $filename, $size, $function ) 
{   
    // Only target jpeg cases, i.e. with the quality set in $arguments[2]       
    if( ! isset( $size['height'] ) || ! isset( $size['width'] ) || ! isset( $arguments[2] ) )
        return $arguments;

    // Modify this part to your needs:
    if( $size['height'] <= 150  && $size['width'] <= 150 )
        $arguments[2] = 2; // very low quality for easy testing

    return $arguments;
}, 10, 4 );

حيث قمنا بتمديد WP_Image_Editor_GD الدرجة:

/**
 * Extend the WP_Image_Editor_GD to add the custom wpse_make_image_arguments filter.
 * @see http://wordpress.stackexchange.com/a/165241/26350
 */
add_filter( 'wp_image_editors', function( $editors ) 
{
    // Note that the WP_Image_Editor_GD and WP_Image_Editor_Imagick classes
    // are included within this filter. So let's do the same for our extended class.

    // Our extended class that overrides the WP_Image_Editor_GD::make_image() method

    if( ! class_exists( 'WPSE_Image_Editor_GD' ) )
    {   
        class WPSE_Image_Editor_GD extends WP_Image_Editor_GD
        {
            protected function make_image( $filename, $function, $arguments ) 
            {
                // Add a custom filter      
                $arguments = apply_filters( 'wpse_make_image_arguments', $arguments, $filename, $this->size, $function );

                // Parent method
                return parent::make_image( $filename, $function, $arguments );
            }
        }
    }

    // Prepend the extended class to the array of image editors:    
    array_unshift( $editors, 'WPSE_Image_Editor_GD' );

    return $editors;
} );

حيث قدمنا العرف wpse_make_image_arguments مرشح.

بهذه الطريقة يمكننا تعديل ضبط الجودة ، قبل وسيطة يتم حفظ الملفات.

هنا مثال:

Example

PS: لم تحقق من حالة عندما Imagick مكتبة يستخدم بدلا من ذلك ، ولكن أعتقد أننا يمكن أن نفعل شيئا مماثلا من خلال توسيع WP_Image_Editor_Imagick فئة.

2) تحديث - ضبط جودة jpeg في حجم الصورة اسم

وهنا نسخة أخرى أين نحن من يحدد جودة jpeg في حجم الصورة اسم:

/**
 * Extend the WP_Image_Editor_GD to set quality per image size name.
 * 
 * @see http://wordpress.stackexchange.com/a/165241/26350
 */
add_filter( 'wp_image_editors', function( $editors ) 
{
    // Note that the WP_Image_Editor_GD and WP_Image_Editor_Imagick classes
    // are included within this filter. So let's do the same for our extended class.

    // Our extended class that overrides the WP_Image_Editor_GD::_resize() method
    if( ! class_exists( 'WPSE2_Image_Editor_GD' ) )
    {   
        class WPSE2_Image_Editor_GD extends WP_Image_Editor_GD
        {
            protected function _resize( $max_w, $max_h, $crop = false )
            {
                $qualities = apply_filters( 'wpse_jpeg_qualities', [] );
                $default_quality = (int) apply_filters( 'wpse_default_jpeg_quality', 82 );                              
                $sizes = wp_get_additional_image_sizes();
                $this->set_quality( $default_quality );         
                foreach( (array) $qualities as $name => $quality )
                {
                    if( 
                        isset( $sizes[$name] ) 
                        && (int)  $sizes[$name]['width']  === (int)  $max_w
                        && (int)  $sizes[$name]['height'] === (int)  $max_h
                        && (bool) $sizes[$name]['crop']   === (bool) $crop  
                    )   
                        $this->set_quality( $quality );                 
                }

                // Parent method
                return parent::_resize( $max_w, $max_h, $crop );
            }
        }
    }

    // Prepend the extended class to the array of image editors:    
    array_unshift( $editors, 'WPSE2_Image_Editor_GD' );

    return $editors;
} );

لاحظت أن المحاصيل الحجج يمكن أن يكون 0 أو false أو فارغة ، لذلك نقوم بتلبيس للتأكد.

هنا قمنا بعرض الفلاتر الجديدة التالية:

add_filter( 'wpse_jpeg_qualities', function( $qualities )
{ 
    return [ 'hello-image' => 2, 'medium' => 2, 'large' => 2 ];
} );

و

add_filter( 'wpse_default_jpeg_quality', function( $quality )
{ 
    return 82;
} );

يمكن أن نأمل تعديلها لتلبية الاحتياجات الخاصة بك!

نصائح أخرى

لا تعليق لدي على وظيفة جنبا إلى جنب مع نسخة أخرى.

المشكلة(s):

لست شور إذا تحديث 2) تعيين جودة jpeg في حجم الصورة اسم في قبول الإجابة كاملة. wp_get_additional_image_sizes() ترجع global $_wp_additional_image_sizes و لا يحتوي على أي معلومات حول الافتراضي أحجام متوسطة ، كبيرة أو مصغرة.

هذا قد لا تعمل في عامل التصفية:'كبيرة' => 2

اعتبارا من https://codex.wordpress.org/Function_Reference/get_intermediate_image_sizes ويوضح مع رمز مخصص إلى retrive جميع الأحجام مع وظيفة مخصصة.

هل أنا محق ؟

ثانيا فكرة تصفية ديفرينت "أحجام" قبل اسم هو صعب. _resize( $max_w, $max_h, $crop = false ) فهم فقط ويوزع يقابل العرض والطول المحاصيل قيمة كل مباراة لنفترض لتتناسب مع اسم.ولكن في كثير من الحالات سوف يكون اسم "آخر" اسم.

"متوسطة" صورة الإعداد له على قدم المساواة "shop_product" الإعداد فقط "زيارة" هذا وظيفة واحدة منهم.ثم نحن لن أعرف ما إذا كان هو "متوسطة" حجم أو "shop_product" حجم هذا يجري تصفيتها.لأن الأهداف هنا هو مجرد التقنية المحاصيل من صورة.

فكرة مع تحديث 2) هو أكثر المنطق handeling ، ولكن أخشى أن techncal architecure ليست هناك.لتحليل كل مسجلا أحجام الصور قبل بناء التصفية ، يصبح أكثر لجعل شور نية ترجع الصحيح جودة صورة البرنامج على موضوع الحالي.

حجم كل الأسماء على قدم المساواة مع الإعدادات سوف تتقاسم نفس نوعية جديدة كما إلا أنهما يشتركان في نفس الصورة على الملقم.

هكذا, إذا كنت لا تزال مشدودة إلى تحديث 2) أعتقد أنك بحاجة إلى استدعاء وظيفة أخرى لملء $sizes متغير, وتحليل من قبل var_dump() على $_wp_additional_image_sizes المساواة في الإعدادات.

النهج في 1) الحل عن طريق... هو أكثر المنطق/ الدلالي.لقد حل هذا عن طريق نفس تمديد الطريقة ولكن باستخدام التصفية الديناميكي بدلا من ذلك:

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

    if(!class_exists('ENTEX_Image_Editor_GD')){   
        class ENTEX_Image_Editor_GD extends WP_Image_Editor_GD {
            private $wp_quality = null;
            protected function _resize($max_w, $max_h, $crop = false){
                $condition = ($crop ? 'true' : 'false');
                if($this->wp_quality === null) $this->wp_quality = $this->get_quality();
                $quality = apply_filters('wp_editor_set_quality_'. $max_w .'x'. $max_h .'_'. $condition, $this->wp_quality);                              
                $this->set_quality((int) $quality);
                return parent::_resize( $max_w, $max_h, $crop );
            }
        }
    }    
    array_unshift($editors, 'ENTEX_Image_Editor_GD');
    return $editors;
});

لتصفية كل فرد حجم الصورة ثم نستخدم:

add_filter('wp_editor_set_quality_160x160_true', function($quality){
    return 96;
});

ماذا أيضا ديفرينت من هذه نسخة موسعة أننا باستخدام/ بملء add_filter('jpeg_quality' ... نسخة القيمة الافتراضية.

وإليك بعض الأمثلة الأخرى من فلاتر مخصصة:

function high_quality_on_medium_images(){
    $in = 'medium';
    $max_w = get_option($in.'_size_w');
    $max_h = get_option($in.'_size_h');
    $crop = get_option($in.'_crop');
    $condition = ($crop ? 'true' : 'false');
    add_filter('wp_editor_set_quality_'. $max_w .'x'. $max_h .'_'. $condition, 'my_theme_high_quality_images', 10, 1);
}
add_action('after_setup_theme', 'high_quality_on_medium_images', 99);

function my_theme_high_quality_images($quality){
    return (int) 82;
}

المطورين الاهتمام

  • جعل شور تطبيق الفلاتر بعد موضوع الصور الإعداد.
  • لا التفاف داخل is_admin() ثم اياكس الاتصال, الأمامية, إبعاد
    نشر الصور متعود لدغة.

كما ذكر المحصول قيمة يمكن أن يكون إما 0 أو false ، يجب تحويل (الباحث) أو (منطقي) في سلسلة مع $condition = ($crop ? 'true' : 'false');

موضوع المطورين الاهتمام

WP الافتراضية ضغط تقدمية جدا.القيم بين 80 و 99 يمكن أن تعود فرق كبير أو لا نتيجة واضحة على الإطلاق.أي comression القيمة 100, ، من المرجح أن ترجع أكبر حجم الملف على "صغيرة الحجم" 800 بكسل الصور ، ثم الأصلي الكبير 3000 بكسل نسخة الحجم.

بعد سنوات عديدة وجدنا السحر رقم 96 ، حجم الملف أصغر ولكن كنت غير قادر على رؤية وجه الاختلاف بين 100 قيمة الضغط.

جودة عالية فوتوشوب استعداد المحل الصور أكبر ثم 800px على ما يرام مع وورد الافتراضي 82.ولكن آي فون "كبير" الإلكتروني نشر صورة حقا بحاجة إلى 96 القيمة على أحجام صغيرة مثل الصور المصغرة.فإنها تصبح "تليين طمس" على Wordpres الضغط.

سوف أكثر من علاقة مع هذا الموضوع الحلول إذا كنت لا تخطط سيناريوهات المشروع الخاص بك المستخدمين أو موضوع.

نهائي تفكير

Im حقا dissapointed في وورد أن هذه المسألة المهمة المهملة في أولوية التنمية ، كما صور أكثر من أي وقت مضى أهمية أن تكون فريدة من نوعها فعالة onload.

Wy لا نحصل فقط على مرشح في المكان المناسب التي يمكن استخدامها الفردية ضغط ؟ أنها تهتم "تغيير الاسم" إلى wp_editor_set_quality ، add_filter('jpeg_quality' ... هو الآن إهمال.لماذا لا نفكر في هذا عبر كل وسيلة فقط إزالة if ( ! $this->quality ) فقط تحقق من مرة طريقة كما ذكر @birgire.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى wordpress.stackexchange
scroll top