सीधे कंटेंट पर जाएं
Images और media

WordPress को अपनी images 82% पर compress करने से रोकिए

WordPress हर उस JPEG को जो वह generate करता है, 0–100 के scale पर quality 82 पर दोबारा encode करता है। यह default WP_Image_Editor::get_default_quality() में रहता है और लागू होता है

प्रकाशित

WordPress हर उस JPEG को जो वह generate करता है, 0–100 के scale पर quality 82 पर दोबारा encode करता है। यह default WP_Image_Editor::get_default_quality() में रहता है और हर उस derivative पर लागू होता है जो WordPress आपके upload से बनाता है — thumbnail, medium, medium_large, large, और हर वह अतिरिक्त size जो आपकी theme register करती है। Photographs के लिए 82 file size और artifacts के बीच एक ठीक-ठाक सौदा है। लेकिन screenshots, UI captures, charts, logos, और किसी भी ऐसी चीज़ के लिए जिसमें sharp text या flat color हो, 82 साफ़ दिखने वाला नुक़सान है: आपको हर अक्षर के आस-पास mosquito noise रेंगती हुई दिखती है और smooth gradients पर banding आ जाती है।

इसे बदलने के लिए एक filter add कीजिए और अपने thumbnails regenerate कीजिए। ख़ासकर screenshots ठीक करने के लिए बेहतर जवाब अक्सर यही होता है कि WordPress को शुरू में JPEG देना ही बंद कर दिया जाए।

यह 82 का number आता कहाँ से है

WordPress ने अपना JPEG default 90 से घटाकर 82 version 4.5 (2016) में किया था, एक page-weight optimization के तौर पर। यह value wp-includes/class-wp-image-editor.php के get_default_quality() से return होती है और तब पढ़ी जाती है जब active editor — अगर आपके host पर Imagick है तो WP_Image_Editor_Imagick, वरना WP_Image_Editor_GD — कोई resized file लिखता है।

ज़रूरी बात: 82 हर derivative size पर लागू होता है, एक बार नहीं। एक image upload कीजिए, और WordPress उसे encoder से कई बार गुज़ारता है, हर pass में quality 82 पर दोबारा quantize करते हुए। Original upload की गई file ख़ुद नहीं छुई जाती अगर वह big-image threshold (लंबे edge पर 2560px) से नीचे है। अगर वह उस threshold से ऊपर है, तो WordPress quality 82 पर एक दोबारा encode की गई -scaled.jpg बनाता है और उसी को “full” size के रूप में serve करता है। तो “मेरी full-resolution image तो ठीक दिखती है लेकिन page वाला version धुँधला दिखता है” का मतलब लगभग हमेशा यही होता है कि srcset कोई quality-82 sub-size या -scaled file उठा रहा है।

quality कैसे बदलें

Hook करने के लिए एक ही filter है। wp_editor_set_quality आधुनिक और canonical वाला है — यह JPEG और WebP दोनों के लिए fire होता है और MIME type receive करता है ताकि आप branch कर सकें:

add_filter( 'wp_editor_set_quality', function ( $quality, $mime_type ) {
    if ( 'image/jpeg' === $mime_type ) {
        return 92; // up from 82
    }
    return $quality;
}, 10, 2 );

इसे एक छोटे mu-plugin (wp-content/mu-plugins/) या site-specific plugin में डालिए। functions.php भी चलता है, लेकिन theme बदलते ही यह setting चली जाती है।

आपको पुराना jpeg_quality filter भी recommend होता दिखेगा। यह अब भी fire होता है (WordPress इसे wp_editor_set_quality के तुरंत बाद लागू करता है, सिर्फ़ JPEG के लिए), लेकिन दोनों को hook करने की कोई ज़रूरत नहीं — wp_editor_set_quality वह सब कुछ cover कर लेता है जो पुराना वाला करता था, और उससे ज़्यादा भी।

एक बात जो सब भूल जाते हैं: यह filter सिर्फ़ उन images पर असर करता है जो इसके active होने के बाद encode होती हैं। जो भी thumbnail पहले से wp-content/uploads में पड़ा है, वह 82 पर लिखा गया था और 82 पर ही रहेगा। उन्हें regenerate कीजिए:

wp media regenerate --yes

अगर आप WP-CLI पर नहीं हैं, तो Regenerate Thumbnails plugin यही काम admin से कर देता है।

किसी number पर तय करने से पहले, यह देख लेना फ़ायदेमंद है कि कोई दी हुई quality आपकी image के साथ असल में करती क्या है, बजाय अंदाज़ा लगाने के। हमारा WordPress JPEG quality tool browser में हर quality level पर एक sample दोबारा encode करता है ताकि आप artifacts को आते हुए देख सकें — यह screenshot पर 82, 90 और 100 के बीच का फ़र्क़ इस तरह साफ़ कर देता है जैसा config file में लिखा कोई number कभी नहीं कर पाएगा।

screenshots और flat graphics के लिए बेहतर fix

JPEG number बढ़ाना बीमारी के लक्षण का इलाज है। Screenshots के साथ असली दिक़्क़त यह है कि JPEG उनके लिए ग़लत codec है। JPEG का DCT compression photographic gradients के लिए tuned है; यह text और UI chrome के hard black-on-white edges पर बिखर जाता है, और यही वजह है कि quality 82 screenshot पर photo के मुक़ाबले इतना ज़्यादा बुरा दिखता है।

इसके बजाय एक PNG upload कीजिए। WordPress PNG sub-sizes को PNG ही रखता है, और PNG lossless होता है — quality filter उसे छूता ही नहीं, इसलिए किसी भी size पर कोई artifacts नहीं होते, सिर्फ़ साफ़ resampling। किसी screenshot के लिए अच्छी तरह optimize किया गया PNG अक्सर उसी image के high-quality JPEG से छोटा होता है, क्योंकि flat color PNG में अच्छे से compress होता है और JPEG में बहुत ख़राब।

अगर आप lossy format की छोटी files चाहते हैं लेकिन JPEG के edge damage के बिना, तो WebP बीच का रास्ता है — लेकिन उसकी quality भी आप उसी wp_editor_set_quality filter से control करते हैं जो ऊपर दिखाया गया है, image/webp पर branch करते हुए।

क्या नहीं करना चाहिए

Quality को globally 100 पर set मत कीजिए। आधे forum threads पर यही सबसे ज़्यादा vote वाला जवाब है, और यह ग़लत है। Quality 100 JPEG lossless नहीं होता — यह फिर भी quantize करता है — लेकिन यह आपकी साइट की हर photograph को बिना किसी दिखने वाले फ़ायदे के बहुत ज़्यादा बड़ा कर देता है, जिससे LCP और Core Web Vitals बिगड़ जाते हैं। जिस format को ज़रूरत है उसके लिए number बढ़ाइए, या graphics के लिए format बदलिए; पूरी साइट पर compression मत उड़ाइए।

class-wp-image-editor.php को edit मत कीजिए। Core में get_default_quality() की return value बदलना तब तक चलता है जब तक अगला wp core update चुपचाप उसे overwrite नहीं कर देता। Filter का इस्तेमाल कीजिए।

“compression से बचने” के लिए image sizes disable मत कीजिए। Thumbnail generation बंद करने से re-encoding नहीं रुकती — यह responsive srcset को तोड़ देता है, जिससे browsers phone पर आपकी full-size image download करते हैं। अलग दिक़्क़त, और नतीजा और भी बुरा।

यह मानकर मत चलिए कि दोबारा upload करने से पुरानी images ठीक हो जाएँगी। अगर आपने filter set कर लिया लेकिन regenerate वाला step छोड़ दिया, तो हर पुराना derivative अब भी quality 82 पर है। Filter सिर्फ़ आगे के लिए काम करता है।

अगर आपकी images 2560px से नीचे हैं तो -scaled file को दोष मत दीजिए — वह path उनके लिए कभी चलता ही नहीं। अगर आप उस पर हैं ही और चाहते हैं कि बिना छुआ original serve हो, तो वह एक अलग setting है; देखिए scaled images disable करना

अभी भी अटके हुए हैं?

अगर regenerate करने के बाद भी कोई ख़ास size ग़लत दिखती है, तो पुष्टि कीजिए कि page असल में कौन-सी file serve कर रहा है — image को नए tab में खोलिए और देखिए कि filename किसी dimension suffix (-1024x768.jpg) या -scaled.jpg पर ख़त्म होता है या नहीं। Image sizes inspector हर वह derivative दिखाता है जो WordPress एक upload से generate करता है, ताकि आप ठीक-ठीक देख सकें कि आपका srcset browser को कौन-सा size दे रहा है और ग़लत file debug करना बंद कर दें।

FAQ

सवाल

अपलोड करने के बाद मेरी WordPress images खराब क्यों दिखती हैं?

WordPress अपने बनाए हर JPEG derivative को 0–100 के scale पर quality 82 पर दोबारा encode करता है, इसलिए thumbnail, medium, medium_large और large — सभी versions में डिटेल कम हो जाती है। तस्वीरों के लिए यह setting ठीक-ठाक सौदा है, लेकिन screenshots, charts, logos और तेज टेक्स्ट वाली किसी भी चीज पर यह साफ दिखने वाला mosquito noise और banding पैदा करती है।

WordPress में JPEG quality कैसे बदलें?

wp_editor_set_quality filter पर hook कीजिए और जब MIME type image/jpeg हो तो कोई बड़ा नंबर लौटाइए, जैसे 92। इसे functions.php के बजाय किसी mu-plugin या site-specific plugin में रखिए, क्योंकि theme बदलते ही यह setting चली जाती है। पुराना jpeg_quality filter अब भी fire होता है, पर इसके ऊपर कुछ नहीं जोड़ता।

क्या quality filter बदलने से पहले से अपलोड की गई images ठीक हो जाएँगी?

नहीं। filter सिर्फ उन्हीं images पर लागू होता है जो उसके सक्रिय होने के बाद encode हुई हों, इसलिए wp-content/uploads में पहले से पड़ा हर derivative quality 82 पर ही रहेगा। उन्हें WP-CLI कमांड wp media regenerate --yes से दोबारा बनाइए, या अगर WP-CLI नहीं चला रहे तो admin में Regenerate Thumbnails plugin इस्तेमाल कीजिए।

WordPress मेरी image के filename में -scaled क्यों जोड़ देता है?

क्योंकि अपलोड की लंबी भुजा 2560px की big-image threshold से आगे निकल गई। ऐसा होते ही WordPress quality 82 पर दोबारा encode किया हुआ एक -scaled.jpg लिखता है और उसी को full size के रूप में परोसता है। 2560px से छोटी images इस रास्ते पर जाती ही नहीं, इसलिए उनकी original फाइल जस की तस रहती है।

क्या WordPress की JPEG quality 100 कर देनी चाहिए?

नहीं। quality 100 वाला JPEG lossless नहीं होता, तब भी quantize करता है, और साइट की हर तस्वीर का साइज बिना किसी दिखने वाले फायदे के फुला देता है, जिससे LCP और Core Web Vitals नीचे खिंच जाते हैं। नंबर सिर्फ उसी format के लिए बढ़ाइए जिसे इसकी जरूरत है, या screenshots और सपाट ग्राफिक्स को lossless PNG के रूप में अपलोड कीजिए।