Oh MyUtils

इमेज कंप्रेसर - PNG, JPG और WebP कंप्रेस ऑनलाइन

क्वालिटी बनाए रखते हुए इमेज कंप्रेस करें। बिफोर/आफ्टर तुलना से PNG, JPG, WebP साइज़ कम करें — अपलोड नहीं, 100% ब्राउज़र में।

अक्सर पूछे जाने वाले प्रश्न

इमेज कंप्रेशन क्या है और मुझे इसकी आवश्यकता क्यों है?

इमेज कंप्रेशन अनावश्यक डेटा को हटाकर या गणितीय एल्गोरिदम लागू करके इमेज फ़ाइल का आकार कम करता है। वेब डेवलपमेंट के लिए, कंप्रेस की गई इमेज तेज़ पेज लोड टाइम, कम बैंडविड्थ खपत, बेहतर Core Web Vitals स्कोर और बेहतर SEO रैंकिंग प्रदान करती हैं। एक सामान्य 5MB DSLR फोटो को न्यूनतम दृश्य गुणवत्ता हानि के साथ 500KB से कम में कंप्रेस किया जा सकता है।

इस इमेज कंप्रेसर टूल का उपयोग कैसे करें?

1. अपनी इमेज को अपलोड एरिया पर ड्रैग और ड्रॉप करें (या फ़ाइलें ब्राउज़ करने के लिए क्लिक करें)। 2. क्वालिटी स्लाइडर एडजस्ट करें (डिफ़ॉल्ट 80% है, जो एक अच्छा संतुलन है)। 3. वैकल्पिक रूप से अधिकतम चौड़ाई/ऊँचाई सेट करें। 4. व्यक्तिगत इमेज पर "कंप्रेस" या बैच प्रोसेसिंग के लिए "सभी कंप्रेस करें" क्लिक करें। 5. तुलना टैब में पहले/बाद की तुलना देखें। 6. व्यक्तिगत इमेज डाउनलोड करें या ZIP आर्काइव के लिए "सभी डाउनलोड (ZIP)" उपयोग करें।

क्या मेरा इमेज डेटा सुरक्षित है? क्या इमेज सर्वर पर अपलोड होती हैं?

आपकी इमेज 100% सुरक्षित हैं और कभी आपके ब्राउज़र से बाहर नहीं जातीं। सभी कंप्रेशन HTML5 Canvas API और OffscreenCanvas का उपयोग करके क्लाइंट-साइड पर किया जाता है। कोई भी इमेज डेटा किसी भी सर्वर पर प्रसारित नहीं होता, जिससे यह टूल पूरी तरह से निजी है। पेज लोड होने के बाद आप इसे ऑफ़लाइन भी उपयोग कर सकते हैं।

लॉसी और लॉसलेस कंप्रेशन में क्या अंतर है?

लॉसी कंप्रेशन (JPEG, WebP) छोटे फ़ाइल आकार के लिए कुछ इमेज डेटा को स्थायी रूप से हटा देता है। 70-90% क्वालिटी सेटिंग पर, दृश्य अंतर आमतौर पर अदृश्य होता है। लॉसलेस कंप्रेशन (PNG) सभी इमेज डेटा को बिल्कुल संरक्षित रखता है, जिसके परिणामस्वरूप बड़ी फ़ाइलें लेकिन परफेक्ट क्वालिटी होती है। JPEG और WebP डिफ़ॉल्ट रूप से लॉसी कंप्रेशन का उपयोग करते हैं; Canvas API का उपयोग करते समय PNG हमेशा लॉसलेस होता है।

मुझे कौन सा इमेज फॉर्मेट उपयोग करना चाहिए: JPEG, PNG, या WebP?

JPEG फ़ोटोग्राफ़ और कई रंगों और ग्रेडिएंट वाली जटिल इमेज के लिए सबसे अच्छा है (ट्रांसपेरेंसी सपोर्ट नहीं)। PNG ग्राफ़िक्स, आइकॉन, स्क्रीनशॉट और टेक्स्ट वाली इमेज के लिए सबसे अच्छा है (ट्रांसपेरेंसी सपोर्ट, बड़ा फ़ाइल आकार)। WebP एक आधुनिक फॉर्मेट है जो समान क्वालिटी पर JPEG से 25-35% छोटा होता है, लॉसी और लॉसलेस दोनों कंप्रेशन और ट्रांसपेरेंसी सपोर्ट करता है।

कंप्रेशन के बाद मेरी PNG फ़ाइल बड़ी क्यों हो गई?

Canvas API लॉसलेस PNG आउटपुट उत्पन्न करता है, जो ऑप्टिमाइज़्ड PNG एन्कोडर (जैसे OptiPNG या pngquant) से भिन्न हो सकता है। यदि मूल PNG पहले से अच्छी तरह ऑप्टिमाइज़ किया गया था, तो Canvas के माध्यम से री-एन्कोडिंग थोड़ी बड़ी फ़ाइल उत्पन्न कर सकती है। PNG आकार कम करने के लिए, इमेज को छोटे आयामों में रीसाइज़ करने का प्रयास करें।

समर्थित अधिकतम फ़ाइल आकार और रिज़ॉल्यूशन क्या है?

यह टूल प्रति फ़ाइल 50MB तक और 16384 x 16384 पिक्सल तक रिज़ॉल्यूशन सपोर्ट करता है (अधिकांश ब्राउज़रों में Canvas API सीमा)। बहुत उच्च-रिज़ॉल्यूशन इमेज के लिए, पहले आयामों को कम करने के लिए रीसाइज़ विकल्प का उपयोग करें, जो कंप्रेशन को भी तेज़ करेगा। मोबाइल डिवाइस पर मेमोरी सीमाओं के कारण अधिकतम रिज़ॉल्यूशन कम हो सकता है।

क्या मैं एक साथ कई इमेज कंप्रेस कर सकता हूँ?

हाँ, बैच प्रोसेसिंग एक साथ 20 इमेज तक सपोर्ट करती है। आप सभी इमेज के लिए एक ग्लोबल क्वालिटी लेवल सेट कर सकते हैं। कंप्रेशन के बाद, सभी कंप्रेस की गई इमेज को एक ZIP फ़ाइल में डाउनलोड करने के लिए "सभी डाउनलोड (ZIP)" उपयोग करें।

कोड उदाहरण

// Client-side image compression using Canvas API
async function compressImage(file, quality = 0.8) {
  return new Promise((resolve, reject) => {
    const img = new Image();
    const url = URL.createObjectURL(file);

    img.onload = () => {
      URL.revokeObjectURL(url);

      const canvas = document.createElement('canvas');
      canvas.width = img.width;
      canvas.height = img.height;

      const ctx = canvas.getContext('2d');
      ctx.drawImage(img, 0, 0);

      // Determine output type (use WebP if supported, fallback to JPEG)
      const outputType = file.type === 'image/png' ? 'image/png' : 'image/webp';

      canvas.toBlob(
        (blob) => {
          if (!blob) {
            reject(new Error('Compression failed'));
            return;
          }
          resolve({
            blob,
            originalSize: file.size,
            compressedSize: blob.size,
            reductionPercent: Math.round((1 - blob.size / file.size) * 100),
          });
        },
        outputType,
        outputType === 'image/png' ? undefined : quality
      );
    };

    img.onerror = () => {
      URL.revokeObjectURL(url);
      reject(new Error('Failed to load image'));
    };

    img.src = url;
  });
}

// Compress with resize
async function compressAndResize(file, maxWidth, maxHeight, quality = 0.8) {
  return new Promise((resolve, reject) => {
    const img = new Image();
    const url = URL.createObjectURL(file);

    img.onload = () => {
      URL.revokeObjectURL(url);

      let { width, height } = img;

      // Calculate new dimensions maintaining aspect ratio
      if (maxWidth && width > maxWidth) {
        height = Math.round((height * maxWidth) / width);
        width = maxWidth;
      }
      if (maxHeight && height > maxHeight) {
        width = Math.round((width * maxHeight) / height);
        height = maxHeight;
      }

      const canvas = document.createElement('canvas');
      canvas.width = width;
      canvas.height = height;

      const ctx = canvas.getContext('2d');
      ctx.drawImage(img, 0, 0, width, height);

      canvas.toBlob(
        (blob) => {
          if (!blob) {
            reject(new Error('Compression failed'));
            return;
          }
          resolve({
            blob,
            originalSize: file.size,
            compressedSize: blob.size,
            width,
            height,
            reductionPercent: Math.round((1 - blob.size / file.size) * 100),
          });
        },
        'image/jpeg',
        quality
      );
    };

    img.onerror = () => {
      URL.revokeObjectURL(url);
      reject(new Error('Failed to load image'));
    };

    img.src = url;
  });
}

// Batch compression
async function compressBatch(files, quality = 0.8) {
  const results = [];
  for (const file of files) {
    try {
      const result = await compressImage(file, quality);
      results.push({ filename: file.name, ...result });
    } catch (error) {
      results.push({ filename: file.name, error: error.message });
    }
  }
  return results;
}

// Usage
const input = document.querySelector('input[type="file"]');
input.addEventListener('change', async (e) => {
  const files = Array.from(e.target.files);
  const results = await compressBatch(files, 0.8);

  results.forEach((result) => {
    if (result.error) {
      console.error(`${result.filename}: ${result.error}`);
    } else {
      console.log(
        `${result.filename}: ${result.originalSize} -> ${result.compressedSize} (${result.reductionPercent}% reduction)`
      );
    }
  });
});

संबंधित उपकरण