{"id":3028,"date":"2025-09-25T12:04:27","date_gmt":"2025-09-25T12:04:27","guid":{"rendered":"https:\/\/yamuparkoti.com\/?page_id=3028"},"modified":"2026-06-12T13:53:26","modified_gmt":"2026-06-12T13:53:26","slug":"compress-jpg-file","status":"publish","type":"page","link":"https:\/\/yamuparkoti.com\/es\/compress-jpg-file\/","title":{"rendered":"Comprimir archivo Jpg"},"content":{"rendered":"<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n    <div class=\"wp-block-bplugins-custom-html\" id='bPluginsCustomHtml-1'>\r\n    <!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Image Compressor Pro | WordPress Plugin<\/title>\n    <link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n    <link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@300;400;500;600;700&#038;display=swap\" rel=\"stylesheet\">\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jszip\/3.10.1\/jszip.min.js\"><\/script>\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/FileSaver.js\/2.0.5\/FileSaver.min.js\"><\/script>\n    <style>\n        :root {\n            --primary-color: #4a6cf7;\n            --primary-light: #e8edff;\n            --secondary-color: #10b981;\n            --dark-color: #1e293b;\n            --light-color: #17171f;\n            --gray-color: #64748b;\n            --border-radius: 8px;\n            --box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n            --transition: all 0.3s ease;\n        }\n\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n        }\n\n        body {\n            font-family: 'Inter', sans-serif;\n            line-height: 1.6;\n            color: #f0f0f0;\n            background-color: #15151c;\n            padding: 20px;\n        }\n\n        .container {\n            max-width: 1200px;\n            margin: 0 auto;\n            background: #15151c;\n            border-radius: var(--border-radius);\n            box-shadow: var(--box-shadow);\n            overflow: hidden;\n        }\n\n        header {\n            background: var(--dark-color);\n            color: white;\n            padding: 20px 30px;\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n        }\n\n        .logo {\n            display: flex;\n            align-items: center;\n            gap: 10px;\n        }\n\n        .logo-icon {\n            width: 32px;\n            height: 32px;\n            background: var(--primary-color);\n            border-radius: 6px;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n        }\n\n        .logo-text {\n            font-size: 1.5rem;\n            font-weight: 700;\n        }\n\n        .tabs {\n            display: flex;\n            background: var(--light-color);\n            border-bottom: 1px solid rgba(255,255,255,.14);\n        }\n\n        .tab {\n            padding: 15px 25px;\n            cursor: pointer;\n            font-weight: 500;\n            border-bottom: 3px solid transparent;\n            transition: var(--transition);\n        }\n\n        .tab.active {\n            color: var(--primary-color);\n            border-bottom-color: var(--primary-color);\n        }\n\n        .tab:hover:not(.active) {\n            background: #15151c;\n        }\n\n        .tab-content {\n            display: none;\n            padding: 30px;\n        }\n\n        .tab-content.active {\n            display: block;\n        }\n\n        .upload-area {\n            border: 2px dashed rgba(255,255,255,.14);\n            border-radius: var(--border-radius);\n            padding: 40px 20px;\n            text-align: center;\n            margin-bottom: 30px;\n            transition: var(--transition);\n            background: #15151c;\n        }\n\n        .upload-area.highlight {\n            border-color: var(--primary-color);\n            background: var(--primary-light);\n        }\n\n        .upload-icon {\n            font-size: 48px;\n            color: var(--gray-color);\n            margin-bottom: 15px;\n        }\n\n        .upload-text {\n            margin-bottom: 20px;\n            color: var(--gray-color);\n        }\n\n        .upload-btn {\n            background: var(--primary-color);\n            color: white;\n            border: none;\n            padding: 12px 24px;\n            border-radius: var(--border-radius);\n            font-weight: 500;\n            cursor: pointer;\n            transition: var(--transition);\n            display: inline-block;\n        }\n\n        .upload-btn:hover {\n            background: #3a5ce5;\n            transform: translateY(-2px);\n        }\n\n        .compression-controls {\n            background: var(--light-color);\n            padding: 20px;\n            border-radius: var(--border-radius);\n            margin-bottom: 30px;\n        }\n\n        .control-group {\n            margin-bottom: 15px;\n        }\n\n        .control-label {\n            display: flex;\n            justify-content: space-between;\n            margin-bottom: 8px;\n        }\n\n        .quality-value {\n            font-weight: 600;\n            color: var(--primary-color);\n        }\n\n        .slider {\n            width: 100%;\n            height: 6px;\n            -webkit-appearance: none;\n            background: #15151c;\n            border-radius: 3px;\n            outline: none;\n        }\n\n        .slider::-webkit-slider-thumb {\n            -webkit-appearance: none;\n            width: 18px;\n            height: 18px;\n            border-radius: 50%;\n            background: var(--primary-color);\n            cursor: pointer;\n        }\n\n        .queue-header {\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            margin-bottom: 20px;\n        }\n\n        .queue-title {\n            font-size: 1.2rem;\n            font-weight: 600;\n        }\n\n        .queue-actions {\n            display: flex;\n            gap: 10px;\n        }\n\n        .action-btn {\n            padding: 8px 16px;\n            border-radius: var(--border-radius);\n            font-weight: 500;\n            cursor: pointer;\n            transition: var(--transition);\n            border: 1px solid rgba(255,255,255,.14);\n            background: #15151c;\n        }\n\n        .action-btn.primary {\n            background: var(--primary-color);\n            color: white;\n            border-color: var(--primary-color);\n        }\n\n        .action-btn.danger {\n            background: #ef4444;\n            color: white;\n            border-color: #ef4444;\n        }\n\n        .action-btn:hover {\n            transform: translateY(-2px);\n            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n        }\n\n        .image-grid {\n            display: grid;\n            grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n            gap: 20px;\n        }\n\n        .image-card {\n            border: 1px solid rgba(255,255,255,.14);\n            border-radius: var(--border-radius);\n            overflow: hidden;\n            background: #15151c;\n            transition: var(--transition);\n        }\n\n        .image-card:hover {\n            transform: translateY(-5px);\n            box-shadow: var(--box-shadow);\n        }\n\n        .image-preview {\n            height: 180px;\n            overflow: hidden;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            background: #15151c;\n        }\n\n        .image-preview img {\n            max-width: 100%;\n            max-height: 100%;\n            object-fit: contain;\n        }\n\n        .image-info {\n            padding: 15px;\n        }\n\n        .image-name {\n            font-weight: 600;\n            margin-bottom: 10px;\n            white-space: nowrap;\n            overflow: hidden;\n            text-overflow: ellipsis;\n        }\n\n        .image-stats {\n            display: flex;\n            justify-content: space-between;\n            margin-bottom: 15px;\n            font-size: 0.9rem;\n        }\n\n        .original-size {\n            color: var(--gray-color);\n        }\n\n        .compressed-size {\n            color: var(--secondary-color);\n            font-weight: 600;\n        }\n\n        .compression-ratio {\n            color: var(--primary-color);\n            font-weight: 600;\n        }\n\n        .image-actions {\n            display: flex;\n            gap: 8px;\n        }\n\n        .image-btn {\n            flex: 1;\n            padding: 8px;\n            border-radius: var(--border-radius);\n            font-size: 0.85rem;\n            text-align: center;\n            cursor: pointer;\n            transition: var(--transition);\n            border: 1px solid rgba(255,255,255,.14);\n            background: #15151c;\n        }\n\n        .image-btn.primary {\n            background: var(--primary-color);\n            color: white;\n            border-color: var(--primary-color);\n        }\n\n        .image-btn:hover {\n            transform: translateY(-2px);\n        }\n\n        .exif-table {\n            width: 100%;\n            border-collapse: collapse;\n            margin-top: 20px;\n        }\n\n        .exif-table th, .exif-table td {\n            padding: 12px 15px;\n            text-align: left;\n            border-bottom: 1px solid rgba(255,255,255,.14);\n        }\n\n        .exif-table th {\n            background: #15151c;\n            font-weight: 600;\n        }\n\n        .progress-bar {\n            height: 6px;\n            background: #15151c;\n            border-radius: 3px;\n            margin-top: 10px;\n            overflow: hidden;\n        }\n\n        .progress-fill {\n            height: 100%;\n            background: var(--secondary-color);\n            width: 0%;\n            transition: width 0.3s ease;\n        }\n\n        .empty-state {\n            text-align: center;\n            padding: 40px 20px;\n            color: var(--gray-color);\n        }\n\n        .empty-icon {\n            font-size: 48px;\n            margin-bottom: 15px;\n            opacity: 0.5;\n        }\n\n        .notification {\n            position: fixed;\n            top: 20px;\n            right: 20px;\n            padding: 15px 20px;\n            border-radius: var(--border-radius);\n            background: #15151c;\n            box-shadow: var(--box-shadow);\n            display: flex;\n            align-items: center;\n            gap: 10px;\n            transform: translateX(150%);\n            transition: transform 0.3s ease;\n            z-index: 1000;\n        }\n\n        .notification.show {\n            transform: translateX(0);\n        }\n\n        .notification.success {\n            border-left: 4px solid var(--secondary-color);\n        }\n\n        .notification.error {\n            border-left: 4px solid #ef4444;\n        }\n\n        .notification-icon {\n            font-size: 20px;\n        }\n\n        .notification.success .notification-icon {\n            color: var(--secondary-color);\n        }\n\n        .notification.error .notification-icon {\n            color: #ef4444;\n        }\n\n        @media (max-width: 768px) {\n            .tabs {\n                flex-wrap: wrap;\n            }\n            \n            .tab {\n                flex: 1;\n                min-width: 120px;\n                text-align: center;\n            }\n            \n            .image-grid {\n                grid-template-columns: 1fr;\n            }\n            \n            .queue-header {\n                flex-direction: column;\n                gap: 15px;\n                align-items: flex-start;\n            }\n            \n            .queue-actions {\n                width: 100%;\n                justify-content: space-between;\n            }\n            \n            .action-btn {\n                flex: 1;\n                text-align: center;\n            }\n        }\n\n        @media (max-width: 480px) {\n            body {\n                padding: 10px;\n            }\n            \n            header {\n                padding: 15px 20px;\n            }\n            \n            .tab-content {\n                padding: 20px 15px;\n            }\n            \n            .upload-area {\n                padding: 30px 15px;\n            }\n        }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"container\">\n        <header>\n            <div class=\"logo\">\n                <div class=\"logo-icon\">\ud83d\udcf7<\/div>\n                <div class=\"logo-text\">Compresor de im\u00e1genes Pro<\/div>\n            <\/div>\n            <div class=\"version\">versi\u00f3n 2.1.0<\/div>\n        <\/header>\n        \n        <div class=\"tabs\">\n            <div class=\"tab active\" data-tab=\"compressor\">Compresor de im\u00e1genes<\/div>\n            <div class=\"tab\" data-tab=\"exif\">Visor EXIF<\/div>\n        <\/div>\n        \n        <div class=\"tab-content active\" id=\"compressor\">\n            <div class=\"upload-area\" id=\"uploadArea\">\n                <div class=\"upload-icon\">\ud83d\udcc1<\/div>\n                <h2 class=\"upload-text\">Drag &#038; Drop your images here<\/h2>\n                <p class=\"upload-subtext\">Admite JPEG, PNG y WebP (m\u00e1ximo 20 archivos)<\/p>\n                <input type=\"file\" id=\"fileInput\" multiple accept=\".jpg,.jpeg,.png,.webp\" style=\"display: none;\">\n                <button class=\"upload-btn\" id=\"uploadBtn\">Seleccionar archivos<\/button>\n            <\/div>\n            \n            <div class=\"compression-controls\">\n                <div class=\"control-group\">\n                    <div class=\"control-label\">\n                        <span>Calidad de compresi\u00f3n<\/span>\n                        <span class=\"quality-value\" id=\"qualityValue\">80%<\/span>\n                    <\/div>\n                    <input type=\"range\" min=\"0\" max=\"100\" value=\"80\" class=\"slider\" id=\"qualitySlider\">\n                <\/div>\n                \n                <div class=\"control-group\">\n                    <div class=\"control-label\">\n                        <span>Formato de salida<\/span>\n                    <\/div>\n                    <select id=\"formatSelect\" class=\"slider\" style=\"width: 100%; padding: 8px; border-radius: var(--border-radius); border: 1px solid rgba(255,255,255,.14);\">\n                        <option value=\"original\">Mantener el formato original<\/option>\n                        <option value=\"jpeg\">JPEG<\/option>\n                        <option value=\"png\">PNG<\/option>\n                        <option value=\"webp\">WebP<\/option>\n                    <\/select>\n                <\/div>\n            <\/div>\n            \n            <div class=\"queue-section\">\n                <div class=\"queue-header\">\n                    <h3 class=\"queue-title\">Cola de compresi\u00f3n (<span id=\"fileCount\">0<\/span> archivos)<\/h3>\n                    <div class=\"queue-actions\">\n                        <button class=\"action-btn primary\" id=\"downloadAllBtn\">Descargar todo como ZIP<\/button>\n                        <button class=\"action-btn danger\" id=\"clearQueueBtn\">Limpiar cola<\/button>\n                    <\/div>\n                <\/div>\n                \n                <div class=\"image-grid\" id=\"imageGrid\">\n                    <div class=\"empty-state\" id=\"emptyState\">\n                        <div class=\"empty-icon\">\ud83d\udcf7<\/div>\n                        <p>A\u00fan no se han subido im\u00e1genes. Arrastra y suelta o haz clic en el bot\u00f3n de arriba para empezar.<\/p>\n                    <\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n        \n        <div class=\"tab-content\" id=\"exif\">\n            <div class=\"upload-area\">\n                <div class=\"upload-icon\">\ud83d\udd0d<\/div>\n                <h2 class=\"upload-text\">Seleccione una imagen para ver los datos EXIF<\/h2>\n                <p class=\"upload-subtext\">Se mostrar\u00e1n los datos EXIF \u200b\u200bpara los formatos de imagen compatibles<\/p>\n                <input type=\"file\" id=\"exifFileInput\" accept=\".jpg,.jpeg,.png,.tiff\" style=\"display: none;\">\n                <button class=\"upload-btn\" id=\"exifUploadBtn\">Seleccionar imagen<\/button>\n            <\/div>\n            \n            <div id=\"exifData\" style=\"display: none;\">\n                <h3>Metadatos EXIF<\/h3>\n                <table class=\"exif-table\">\n                    <thead>\n                        <tr>\n                            <th>Propiedad<\/th>\n                            <th>Valor<\/th>\n                        <\/tr>\n                    <\/thead>\n                    <tbody id=\"exifTableBody\">\n                        <!-- EXIF data will be populated here -->\n                    <\/tbody>\n                <\/table>\n            <\/div>\n        <\/div>\n    <\/div>\n    \n    <div class=\"notification\" id=\"notification\">\n        <div class=\"notification-icon\">\u2713<\/div>\n        <div class=\"notification-text\">\u00a1Operaci\u00f3n completada exitosamente!<\/div>\n    <\/div>\n\n    <script>\n        \/\/ DOM Elements\n        const uploadArea = document.getElementById('uploadArea');\n        const fileInput = document.getElementById('fileInput');\n        const uploadBtn = document.getElementById('uploadBtn');\n        const qualitySlider = document.getElementById('qualitySlider');\n        const qualityValue = document.getElementById('qualityValue');\n        const formatSelect = document.getElementById('formatSelect');\n        const imageGrid = document.getElementById('imageGrid');\n        const emptyState = document.getElementById('emptyState');\n        const fileCount = document.getElementById('fileCount');\n        const downloadAllBtn = document.getElementById('downloadAllBtn');\n        const clearQueueBtn = document.getElementById('clearQueueBtn');\n        const tabs = document.querySelectorAll('.tab');\n        const tabContents = document.querySelectorAll('.tab-content');\n        const exifFileInput = document.getElementById('exifFileInput');\n        const exifUploadBtn = document.getElementById('exifUploadBtn');\n        const exifData = document.getElementById('exifData');\n        const exifTableBody = document.getElementById('exifTableBody');\n        const notification = document.getElementById('notification');\n\n        \/\/ State\n        let files = [];\n        let compressedFiles = [];\n        let compressionQuality = 80;\n\n        \/\/ Event Listeners\n        uploadBtn.addEventListener('click', () => fileInput.click());\n        fileInput.addEventListener('change', handleFileSelect);\n        qualitySlider.addEventListener('input', updateQuality);\n        downloadAllBtn.addEventListener('click', downloadAllAsZip);\n        clearQueueBtn.addEventListener('click', clearQueue);\n        exifUploadBtn.addEventListener('click', () => exifFileInput.click());\n        exifFileInput.addEventListener('change', handleExifFileSelect);\n        formatSelect.addEventListener('change', handleFormatChange);\n\n        \/\/ Drag and Drop\n        ['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => {\n            uploadArea.addEventListener(eventName, preventDefaults, false);\n        });\n\n        function preventDefaults(e) {\n            e.preventDefault();\n            e.stopPropagation();\n        }\n\n        ['dragenter', 'dragover'].forEach(eventName => {\n            uploadArea.addEventListener(eventName, highlight, false);\n        });\n\n        ['dragleave', 'drop'].forEach(eventName => {\n            uploadArea.addEventListener(eventName, unhighlight, false);\n        });\n\n        function highlight() {\n            uploadArea.classList.add('highlight');\n        }\n\n        function unhighlight() {\n            uploadArea.classList.remove('highlight');\n        }\n\n        uploadArea.addEventListener('drop', handleDrop, false);\n\n        function handleDrop(e) {\n            const dt = e.dataTransfer;\n            const droppedFiles = dt.files;\n            handleFiles(droppedFiles);\n        }\n\n        \/\/ Tab switching\n        tabs.forEach(tab => {\n            tab.addEventListener('click', () => {\n                const tabId = tab.getAttribute('data-tab');\n                \n                tabs.forEach(t => t.classList.remove('active'));\n                tabContents.forEach(tc => tc.classList.remove('active'));\n                \n                tab.classList.add('active');\n                document.getElementById(tabId).classList.add('active');\n            });\n        });\n\n        \/\/ Functions\n        function handleFileSelect(e) {\n            const selectedFiles = e.target.files;\n            handleFiles(selectedFiles);\n        }\n\n        function handleFiles(selectedFiles) {\n            if (files.length + selectedFiles.length > 20) {\n                showNotification('Maximum 20 files allowed. Please remove some files before adding more.', 'error');\n                return;\n            }\n\n            for (let i = 0; i < selectedFiles.length; i++) {\n                const file = selectedFiles[i];\n                if (isValidFileType(file)) {\n                    files.push(file);\n                    processFile(file);\n                } else {\n                    showNotification(`File \"${file.name}\" is not a supported format.`, 'error');\n                }\n            }\n\n            updateFileCount();\n            fileInput.value = ''; \/\/ Reset input to allow selecting same files again\n        }\n\n        function isValidFileType(file) {\n            const validTypes = ['image\/jpeg', 'image\/png', 'image\/webp'];\n            return validTypes.includes(file.type);\n        }\n\n        function processFile(file) {\n            \/\/ Hide empty state\n            emptyState.style.display = 'none';\n            \n            \/\/ Create image card\n            const card = document.createElement('div');\n            card.className = 'image-card';\n            card.id = `card-${file.name.replace(\/\\s\/g, '-')}`;\n            \n            \/\/ Create preview\n            const preview = document.createElement('div');\n            preview.className = 'image-preview';\n            \n            const img = document.createElement('img');\n            img.src = URL.createObjectURL(file);\n            preview.appendChild(img);\n            \n            \/\/ Create file info\n            const info = document.createElement('div');\n            info.className = 'image-info';\n            \n            const name = document.createElement('div');\n            name.className = 'image-name';\n            name.textContent = file.name;\n            \n            const stats = document.createElement('div');\n            stats.className = 'image-stats';\n            \n            const originalSize = document.createElement('div');\n            originalSize.className = 'original-size';\n            originalSize.textContent = `Original: ${formatFileSize(file.size)}`;\n            \n            const compressedSize = document.createElement('div');\n            compressedSize.className = 'compressed-size';\n            compressedSize.textContent = 'Compressed: --';\n            compressedSize.id = `compressed-${file.name.replace(\/\\s\/g, '-')}`;\n            \n            const ratio = document.createElement('div');\n            ratio.className = 'compression-ratio';\n            ratio.textContent = '--% smaller';\n            ratio.id = `ratio-${file.name.replace(\/\\s\/g, '-')}`;\n            \n            stats.appendChild(originalSize);\n            stats.appendChild(compressedSize);\n            stats.appendChild(ratio);\n            \n            \/\/ Create actions\n            const actions = document.createElement('div');\n            actions.className = 'image-actions';\n            \n            const downloadBtn = document.createElement('button');\n            downloadBtn.className = 'image-btn primary';\n            downloadBtn.textContent = 'Download';\n            downloadBtn.addEventListener('click', () => downloadFile(file));\n            \n            const removeBtn = document.createElement('button');\n            removeBtn.className = 'image-btn';\n            removeBtn.textContent = 'Remove';\n            removeBtn.addEventListener('click', () => removeFile(file, card));\n            \n            actions.appendChild(downloadBtn);\n            actions.appendChild(removeBtn);\n            \n            \/\/ Add progress bar\n            const progressBar = document.createElement('div');\n            progressBar.className = 'progress-bar';\n            const progressFill = document.createElement('div');\n            progressFill.className = 'progress-fill';\n            progressFill.id = `progress-${file.name.replace(\/\\s\/g, '-')}`;\n            progressBar.appendChild(progressFill);\n            \n            \/\/ Assemble card\n            info.appendChild(name);\n            info.appendChild(stats);\n            info.appendChild(progressBar);\n            info.appendChild(actions);\n            \n            card.appendChild(preview);\n            card.appendChild(info);\n            \n            imageGrid.appendChild(card);\n            \n            \/\/ Compress the file\n            compressFile(file, compressionQuality);\n        }\n\n        function compressFile(file, quality) {\n            const progressFill = document.getElementById(`progress-${file.name.replace(\/\\s\/g, '-')}`);\n            \n            \/\/ For images, use Canvas API for compression\n            const reader = new FileReader();\n            \n            reader.onload = function(e) {\n                const img = new Image();\n                img.src = e.target.result;\n                \n                img.onload = function() {\n                    const canvas = document.createElement('canvas');\n                    const ctx = canvas.getContext('2d');\n                    \n                    \/\/ Calculate new dimensions if needed (maintain aspect ratio)\n                    let width = img.width;\n                    let height = img.height;\n                    const maxDimension = 2000; \/\/ Max width\/height\n                    \n                    if (width > maxDimension || height > maxDimension) {\n                        if (width > height) {\n                            height = Math.round((height * maxDimension) \/ width);\n                            width = maxDimension;\n                        } else {\n                            width = Math.round((width * maxDimension) \/ height);\n                            height = maxDimension;\n                        }\n                    }\n                    \n                    canvas.width = width;\n                    canvas.height = height;\n                    \n                    \/\/ Draw image on canvas\n                    ctx.drawImage(img, 0, 0, width, height);\n                    \n                    \/\/ Get the output format\n                    let outputFormat = 'image\/jpeg';\n                    if (formatSelect.value === 'png') {\n                        outputFormat = 'image\/png';\n                    } else if (formatSelect.value === 'webp') {\n                        outputFormat = 'image\/webp';\n                    } else if (formatSelect.value === 'original') {\n                        \/\/ Keep the original format\n                        outputFormat = file.type;\n                    }\n                    \n                    \/\/ Convert to blob with quality setting\n                    canvas.toBlob((blob) => {\n                        progressFill.style.width = '100%';\n                        updateFileStats(file, blob.size);\n                        \n                        \/\/ Determine file extension based on output format\n                        let fileExtension = '.jpg';\n                        if (outputFormat === 'image\/png') fileExtension = '.png';\n                        if (outputFormat === 'image\/webp') fileExtension = '.webp';\n                        \n                        \/\/ Get original filename without extension\n                        const originalName = file.name.substring(0, file.name.lastIndexOf('.'));\n                        \n                        compressedFiles.push({\n                            original: file,\n                            compressed: blob,\n                            name: originalName + fileExtension\n                        });\n                    }, outputFormat, quality \/ 100);\n                };\n            };\n            \n            reader.readAsDataURL(file);\n            \n            \/\/ Simulate progress (in a real implementation, this would be based on actual compression progress)\n            let progress = 0;\n            const progressInterval = setInterval(() => {\n                progress += 5;\n                progressFill.style.width = `${progress}%`;\n                \n                if (progress >= 90) {\n                    clearInterval(progressInterval);\n                }\n            }, 100);\n        }\n\n        function updateFileStats(file, compressedSize) {\n            const compressedElement = document.getElementById(`compressed-${file.name.replace(\/\\s\/g, '-')}`);\n            const ratioElement = document.getElementById(`ratio-${file.name.replace(\/\\s\/g, '-')}`);\n            \n            compressedElement.textContent = `Compressed: ${formatFileSize(compressedSize)}`;\n            \n            const ratio = ((file.size - compressedSize) \/ file.size * 100).toFixed(1);\n            ratioElement.textContent = `${ratio}% smaller`;\n            \n            if (parseFloat(ratio) > 0) {\n                ratioElement.style.color = 'var(--secondary-color)';\n            } else {\n                ratioElement.style.color = '#ef4444';\n            }\n        }\n\n        function updateQuality() {\n            compressionQuality = qualitySlider.value;\n            qualityValue.textContent = `${compressionQuality}%`;\n            \n            \/\/ Recompress all files with new quality setting\n            if (files.length > 0) {\n                compressedFiles = [];\n                files.forEach(file => {\n                    const progressFill = document.getElementById(`progress-${file.name.replace(\/\\s\/g, '-')}`);\n                    progressFill.style.width = '0%';\n                    compressFile(file, compressionQuality);\n                });\n            }\n        }\n\n        function handleFormatChange() {\n            \/\/ Recompress all files with new format setting\n            if (files.length > 0) {\n                compressedFiles = [];\n                files.forEach(file => {\n                    const progressFill = document.getElementById(`progress-${file.name.replace(\/\\s\/g, '-')}`);\n                    progressFill.style.width = '0%';\n                    compressFile(file, compressionQuality);\n                });\n            }\n        }\n\n        function downloadFile(file) {\n            const compressedFile = compressedFiles.find(f => f.original === file);\n            \n            if (compressedFile) {\n                const url = URL.createObjectURL(compressedFile.compressed);\n                const a = document.createElement('a');\n                a.href = url;\n                a.download = compressedFile.name;\n                document.body.appendChild(a);\n                a.click();\n                document.body.removeChild(a);\n                URL.revokeObjectURL(url);\n                \n                showNotification(`Downloaded ${compressedFile.name} successfully!`);\n            } else {\n                showNotification(`File ${file.name} is not ready yet. Please wait.`, 'error');\n            }\n        }\n\n        function downloadAllAsZip() {\n            if (compressedFiles.length === 0) {\n                showNotification('No files to download.', 'error');\n                return;\n            }\n            \n            const zip = new JSZip();\n            let addedFiles = 0;\n            \n            compressedFiles.forEach(fileObj => {\n                zip.file(fileObj.name, fileObj.compressed);\n                addedFiles++;\n            });\n            \n            zip.generateAsync({ type: 'blob' })\n                .then(blob => {\n                    saveAs(blob, 'compressed_images.zip');\n                    showNotification(`Downloaded ${addedFiles} files as ZIP successfully!`);\n                })\n                .catch(err => {\n                    console.error('Error creating ZIP:', err);\n                    showNotification('Error creating ZIP file.', 'error');\n                });\n        }\n\n        function removeFile(file, card) {\n            files = files.filter(f => f !== file);\n            compressedFiles = compressedFiles.filter(f => f.original !== file);\n            card.remove();\n            \n            if (files.length === 0) {\n                emptyState.style.display = 'block';\n            }\n            \n            updateFileCount();\n        }\n\n        function clearQueue() {\n            if (files.length === 0) {\n                showNotification('Queue is already empty.', 'error');\n                return;\n            }\n            \n            files = [];\n            compressedFiles = [];\n            imageGrid.innerHTML = '';\n            emptyState.style.display = 'block';\n            updateFileCount();\n            \n            showNotification('Queue cleared successfully.');\n        }\n\n        function updateFileCount() {\n            fileCount.textContent = files.length;\n        }\n\n        function formatFileSize(bytes) {\n            if (bytes === 0) return '0 Bytes';\n            \n            const k = 1024;\n            const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n            const i = Math.floor(Math.log(bytes) \/ Math.log(k));\n            \n            return parseFloat((bytes \/ Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n        }\n\n        function showNotification(message, type = 'success') {\n            const notificationText = notification.querySelector('.notification-text');\n            notificationText.textContent = message;\n            \n            notification.className = 'notification';\n            notification.classList.add(type);\n            \n            notification.classList.add('show');\n            \n            setTimeout(() => {\n                notification.classList.remove('show');\n            }, 3000);\n        }\n\n        \/\/ EXIF Viewer functionality\n        function handleExifFileSelect(e) {\n            const file = e.target.files[0];\n            \n            if (!file) return;\n            \n            if (!file.type.match(\/image\\\/(jpeg|png|tiff)\/)) {\n                showNotification('Please select a JPEG, PNG, or TIFF image for EXIF data.', 'error');\n                return;\n            }\n            \n            \/\/ In a real implementation, you would use a library like exif-js to read EXIF data\n            \/\/ For this demo, we'll simulate EXIF data\n            \n            const simulatedExifData = {\n                'Make': 'Canon',\n                'Model': 'EOS 5D Mark IV',\n                'Software': 'Adobe Photoshop CC 2021',\n                'DateTime': '2023:05:15 14:30:22',\n                'ExposureTime': '1\/250',\n                'FNumber': 'f\/5.6',\n                'ISOSpeedRatings': '200',\n                'FocalLength': '50 mm',\n                'LensModel': 'EF50mm f\/1.8 STM',\n                'ImageWidth': '6720',\n                'ImageHeight': '4480',\n                'GPSLatitude': '40.7128\u00b0 N',\n                'GPSLongitude': '74.0060\u00b0 W'\n            };\n            \n            displayExifData(simulatedExifData);\n            exifFileInput.value = ''; \/\/ Reset input\n        }\n\n        function displayExifData(data) {\n            exifTableBody.innerHTML = '';\n            \n            for (const [key, value] of Object.entries(data)) {\n                const row = document.createElement('tr');\n                \n                const keyCell = document.createElement('td');\n                keyCell.textContent = key;\n                \n                const valueCell = document.createElement('td');\n                valueCell.textContent = value;\n                \n                row.appendChild(keyCell);\n                row.appendChild(valueCell);\n                exifTableBody.appendChild(row);\n            }\n            \n            exifData.style.display = 'block';\n        }\n    <\/script>\n<\/body>\n<\/html>    <\/div>\r\n    \n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n\n<div class=\"wp-block-kadence-column kadence-column3028_bdd3d6-08\"><div class=\"kt-inside-inner-col\">\n\n<div class=\"wp-block-kadence-column kadence-column3028_fa1306-c8\"><div class=\"kt-inside-inner-col\"><\/div><\/div>\n\n\n\n<div class=\"wp-block-kadence-column kadence-column3028_9922a7-9a\"><div class=\"kt-inside-inner-col\">\n<h2 class=\"wp-block-heading\"><strong>Comprimir archivos JPG en l\u00ednea: gratis, r\u00e1pido y confiable<\/strong><\/h2>\n\n\n\n<p>Bien, seamos honestos. Las im\u00e1genes son, b\u00e1sicamente, lo que mueve internet. <\/p>\n\n\n\n<p>For <a href=\"https:\/\/shopify.pxf.io\/AWzz5D\" data-type=\"link\" data-id=\"https:\/\/shopify.pxf.io\/AWzz5D\" target=\"_blank\" rel=\"noopener\">Shopify<\/a>, necesitas comprimir el archivo jpg en cualquier momento.<\/p>\n\n\n\n<p>It doesn&#8217;t matter if you&#8217;re working with a small business, writing a blog, or just sharing your pet&#8217;s picture with family\u2013 everything boils down to photos. And compress JPEG file? Well, they&#8217;re absolutely ubiquitous.<\/p>\n\n\n\n<p>But here&#8217;s the thing: those files can be absurdly massive. I recall trying to upload a vacation snap that was 12 MB. Twelve! It felt like my Wi-Fi aged ten years just watching it load.<\/p>\n\n\n\n<p>Large images slow websites down, eat up your phone storage, and sharing them makes you feel like you&#8217;re back in the dial-up days. So yes, making them smaller is definitely the way to go.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\ud83d\udd0e \u00bfQu\u00e9 significa \u201cComprimir archivo JPG\u201d?<\/strong><\/h2>\n\n\n\n<p>\u00a1Imagina necesitar m\u00e1s espacio en tu maleta para un viaje despu\u00e9s de haberlo empacado todo! Es como darse cuenta de repente de que la tecnolog\u00eda de compresi\u00f3n para archivos JPG es similar: reduce el tama\u00f1o del archivo sin afectar negativamente la calidad de la imagen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1200\" height=\"630\" src=\"https:\/\/yamuparkoti.com\/wp-content\/uploads\/2026\/06\/dark-banner-comp-1781272398734.png\" alt=\"Compress JPG File \u2014 yamuparkoti.com\" class=\"wp-image-3448\" srcset=\"https:\/\/yamuparkoti.com\/wp-content\/uploads\/2026\/06\/dark-banner-comp-1781272398734.png 1200w, https:\/\/yamuparkoti.com\/wp-content\/uploads\/2026\/06\/dark-banner-comp-1781272398734-300x158.png 300w, https:\/\/yamuparkoti.com\/wp-content\/uploads\/2026\/06\/dark-banner-comp-1781272398734-1024x538.png 1024w, https:\/\/yamuparkoti.com\/wp-content\/uploads\/2026\/06\/dark-banner-comp-1781272398734-768x403.png 768w, https:\/\/yamuparkoti.com\/wp-content\/uploads\/2026\/06\/dark-banner-comp-1781272398734-18x9.png 18w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/figure>\n\n\n\n<p>In fact sometimes photos that must be 5 MB can be shrunk down to just 500 KB\u2013 a big difference! Uploading is faster; pages load more quickly. It eliminates that feeling of waiting for the internet \u201cto crawl out of bed.&#8221;<\/p>\n\n\n\n<p>Podemos dividir los m\u00e9todos en dos grandes tipos:<\/p>\n\n\n\n<p>1. Con p\u00e9rdida: se encarga de los detalles m\u00e1s peque\u00f1os. \u00bfSer\u00eda correcto decir que la mayor\u00eda de los ojos humanos no los ven?<\/p>\n\n\n\n<p>2. Sin p\u00e9rdida: definitivamente mantiene cada detalle intacto y, al mismo tiempo, logra ahorrar algo de espacio.<\/p>\n\n\n\n<p>Which one is the best? That changes for each case, you know! For me personally with images going online, I almost always go with lossy compression jpg file\u2013 because honestly, I can&#8217;t spot any difference.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\ud83d\ude80 \u00bfPor qu\u00e9 molestarse en comprimir archivos JPG?<\/strong><\/h2>\n\n\n\n<p>\u00bfA\u00fan no te convence? Aqu\u00ed te explicamos por qu\u00e9 es importante:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u26a1 Tu sitio carga m\u00e1s r\u00e1pido. A Google le gusta eso. Y a tus visitantes tambi\u00e9n.<\/li>\n\n\n\n<li>\ud83d\udcbe Ahorras espacio. (Mi port\u00e1til me lo agradece siempre).<\/li>\n\n\n\n<li>Compartir es m\u00e1s r\u00e1pido. Los correos electr\u00f3nicos no rebotan con el mensaje &#034;archivo demasiado grande&#034;.<\/li>\n\n\n\n<li>\ud83d\ude00 La gente no hace clic mientras espera.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\ud83d\udee0 \u00bfC\u00f3mo lo haces realmente?<\/strong><\/h2>\n\n\n\n<p>No es ciencia espacial. Tres pasos y listo:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Sube tu JPG. Arr\u00e1stralo, su\u00e9ltalo o haz clic.<\/li>\n\n\n\n<li>\ud83c\udf9a Elige cu\u00e1nto quieres encogerlo.<\/li>\n\n\n\n<li>\u2b07 \u00a1Descarga! \u00a1Listo!<\/li>\n<\/ol>\n\n\n\n<p>Sin registros. Sin marcas de agua enga\u00f1osas. Sin ventanas emergentes de &#034;actualizar&#034;.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\ud83c\udf1f Por qu\u00e9 esta herramienta no es como las dem\u00e1s<\/strong><\/h2>\n\n\n\n<p>He probado algunos de esos compresores online sospechosos. Hay anuncios por todas partes. Los archivos se env\u00edan a qui\u00e9n sabe d\u00f3nde. Imposible.<\/p>\n\n\n\n<p>\u00bf\u00c9ste?<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 Gratis. Sin muros de pago sorpresa. Solo comprime el archivo jpg.<\/li>\n\n\n\n<li>\ud83d\udd12 Privado. Los archivos nunca salen de tu navegador.<\/li>\n\n\n\n<li>\u26a1 R\u00e1pido. Sube un lote completo (s\u00ed, hasta 20).<\/li>\n\n\n\n<li>\ud83c\udfa8 Flexible. Guarda como JPG, PNG o incluso WebP si lo prefieres.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\ud83d\udcf8 Cuando la compresi\u00f3n salva el d\u00eda<\/strong><\/h2>\n\n\n\n<p>Entender\u00edas su importancia porque:<\/p>\n\n\n\n<p>De vez en cuando subo im\u00e1genes de productos para una tienda, \u00a1como cuando Shopify me rechaz\u00f3 por un archivo enorme!<\/p>\n\n\n\n<p>Compartiendo fotograf\u00edas detalladas en Instagram.<\/p>\n\n\n\n<p>\u00bfDe verdad hay gente en el trabajo que dice: \u201cEsto es demasiado grande para enviarlo por correo electr\u00f3nico\u201d?<\/p>\n\n\n\n<p>\u00a1Espero mejorar el tiempo de carga de mi sitio web, animando as\u00ed a Google a colocarme en la p\u00e1gina 1 en lugar de la p\u00e1gina 7!<\/p>\n\n\n\n<p>Estoy intentando liberar espacio en mi iPhone antiguo que sigue gritando &#034;\u00a1Almacenamiento lleno!&#034;<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\ud83d\udcc8 La ventaja de SEO de la que nadie habla<\/strong><\/h2>\n\n\n\n<p>La cuesti\u00f3n es la siguiente: los sitios lentos perjudican tu posicionamiento en Google. Nadie espera a que cargue una p\u00e1gina. Al comprimir archivos JPG, consigues lo siguiente:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 Mejora los Core Web Vitals (no te preocupes, solo \u201ccosas de velocidad del sitio\u201d).<\/li>\n\n\n\n<li>\ud83d\udcca Obtenga mejores clasificaciones.<\/li>\n\n\n\n<li>\u23f3 Mantenga a las personas en su sitio por m\u00e1s tiempo.<\/li>\n\n\n\n<li>\ud83d\udcb0 Tal vez incluso hagamos m\u00e1s ventas porque la gente no se da por vencida.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\ud83d\udd12 \u00bfPero es seguro?<\/strong><\/h2>\n\n\n\n<p>Y eso tambi\u00e9n era una preocupaci\u00f3n m\u00eda.<\/p>\n\n\n\n<p>Varias herramientas transfieren autom\u00e1ticamente tus im\u00e1genes a sus servidores, lo cual resulta inc\u00f3modo si deseas reducir el tama\u00f1o de los archivos de im\u00e1genes personales.<\/p>\n\n\n\n<p>Esta herramienta es diferente; no se env\u00eda nada a ninguna parte. Todo sucede dentro de tu navegador web.<\/p>\n\n\n\n<p>No se necesita ninguna cuenta, no hay recopilaci\u00f3n de datos ni almacenamiento en la &#034;nube&#034; de sus archivos; solo un procesamiento r\u00e1pido y eficiente.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\ud83d\udca1Consejos profesionales que he aprendido<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud83c\udf9a Generalmente una calidad del 80% me parece perfecta.<\/li>\n\n\n\n<li>\ud83c\udf0d Si es para la web, los archivos WebP son a\u00fan m\u00e1s peque\u00f1os.<\/li>\n\n\n\n<li>\ud83d\uddc2 Guarda siempre el original en un lugar seguro. Cr\u00e9eme, lo he aprendido a las malas.<\/li>\n\n\n\n<li>\ud83d\udda5 Reducir antes de subir a WordPress o <a href=\"https:\/\/yamuparkoti.com\/es\/\" data-type=\"link\" data-id=\"https:\/\/yamuparkoti.com\/\">Shopify<\/a>\u2014ahorra dolores de cabeza m\u00e1s adelante.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\ud83d\udc49\u00bfListo para probar?<\/strong><\/h2>\n\n\n\n<p>Really, don&#8217;t analyze it too much. Just upload an image there automatically compress jpg file to see what occurs!<\/p>\n\n\n\n<p>En el peor de los casos, liberas algo de espacio; en el mejor de los casos, los visitantes de tu sitio web experimentan que se carga a gran velocidad.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u2753 Preguntas frecuentes r\u00e1pidas<\/strong><\/h2>\n\n\n\n<p><strong>\u00bfLa compresi\u00f3n perjudica la calidad?<\/strong><br>Un poco, pero normalmente no lo notar\u00e1s.<\/p>\n\n\n\n<p><strong>\u00bfPuedo comprimir varios archivos a la vez?<\/strong><br>S\u00ed, hasta 20 de una sola vez.<\/p>\n\n\n\n<p><strong>\u00bfEs seguro?<\/strong><br>M\u00e1xima seguridad. Los archivos permanecen en tu navegador.<\/p>\n\n\n\n<p><strong>\u00bfJPG o WebP?<\/strong><br>JPG funciona en todas partes. WebP es m\u00e1s peque\u00f1o, pero no todos los sitios lo aceptan.<\/p>\n\n\n\n<p><strong>\u00bfAyudar\u00e1 al SEO?<\/strong><br>S\u00ed. P\u00e1ginas m\u00e1s r\u00e1pidas = Google m\u00e1s feliz.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\ud83c\udfc1Reflexiones finales<\/strong><\/h2>\n\n\n\n<p>And giant images are a problem\u2013 they don&#8217;t just slow your site down but take up loads of space. We have all been caught out by them; it&#8217;s just one too many times.<\/p>\n\n\n\n<p>Con la compresi\u00f3n, usted:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u26a1 Haz que tu sitio web sea m\u00e1s r\u00e1pido<\/li>\n\n\n\n<li>\ud83d\udcbe Ahorra espacio<\/li>\n\n\n\n<li>\ud83d\udcf2 Comparte fotos sin insultar a tu bandeja de entrada<\/li>\n<\/ul>\n\n\n\n<p>As\u00ed que s\u00ed, int\u00e9ntalo. Reduce esos archivos JPG y agrad\u00e9cetelo despu\u00e9s.<\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-kadence-column kadence-column3028_97f692-5a\"><div class=\"kt-inside-inner-col\"><\/div><\/div>\n\n<\/div><\/div>\n\n\n\n\n<p><\/p>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":3448,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_kadence_starter_templates_imported_post":false,"footnotes":""},"class_list":["post-3028","page","type-page","status-publish","has-post-thumbnail","hentry"],"rankMath":{"parentDomain":"yamuparkoti.com","noFollowDomains":[],"noFollowExcludeDomains":[],"noFollowExternalLinks":false,"featuredImageNotice":"La imagen destacada debe tener al menos 200 por 200 p\u00edxeles para que Facebook y otros sitios de redes sociales puedan escogerla.","pluginReviewed":false,"postSettings":{"linkSuggestions":true,"useFocusKeyword":false},"frontEndScore":false,"postName":"compress-jpg-file","permalinkFormat":"https:\/\/yamuparkoti.com\/es\/%pagename%\/","showLockModifiedDate":true,"assessor":{"focusKeywordLink":"https:\/\/yamuparkoti.com\/wp-admin\/edit.php?focus_keyword=%focus_keyword%&post_type=%post_type%","hasTOCPlugin":false,"primaryTaxonomy":false,"serpData":{"title":"Compress JPG File Online [Sep 2025] \u2013 Free Image Optimizer","description":"Easily compress JPG files online without losing quality. Reduce image size, speed up your website with our free JPG compressor tool.","focusKeywords":"compress jpg file,compress jpg,image size reducer,picture compressor,compress jpeg","pillarContent":false,"canonicalUrl":"","breadcrumbTitle":"","advancedRobots":{"max-snippet":"-1","max-video-preview":"-1","max-image-preview":"large"},"facebookTitle":"","facebookDescription":"","facebookImage":"","facebookImageID":"","facebookHasOverlay":false,"facebookImageOverlay":"","facebookAuthor":"","twitterCardType":"","twitterUseFacebook":true,"twitterTitle":"","twitterDescription":"","twitterImage":"","twitterImageID":"","twitterHasOverlay":false,"twitterImageOverlay":"","twitterPlayerUrl":"","twitterPlayerSize":"","twitterPlayerStream":"","twitterPlayerStreamCtype":"","twitterAppDescription":"","twitterAppIphoneName":"","twitterAppIphoneID":"","twitterAppIphoneUrl":"","twitterAppIpadName":"","twitterAppIpadID":"","twitterAppIpadUrl":"","twitterAppGoogleplayName":"","twitterAppGoogleplayID":"","twitterAppGoogleplayUrl":"","twitterAppCountry":"","robots":{"index":true},"twitterAuthor":"nombre de usuario","primaryTerm":0,"authorName":"Yam Bahadur Uparkoti","titleTemplate":"%title% %sep% %sitename%","descriptionTemplate":"%excerpt%","showScoreFrontend":true,"lockModifiedDate":false},"powerWords":["incre\u00edble","asombroso","maravilloso","\u00fanico","hermoso","felicidad","brillante","cautivador","carism\u00e1tico","impactante","claro","completamente","confidencial","confianza","significativo","creativo","definitivamente","delicioso","demostrar","apres\u00farate","decidido","digno","din\u00e1mico","impresionante","esencial","inspirador","innovador","intenso","eficaz","m\u00e1gico","magn\u00edfico","hist\u00f3rico","importante","incre\u00edble","indispensable","inolvidable","irresistible","legendario","luminoso","lujo","m\u00e1gico","magn\u00edfico","majestuoso","memorable","maravilloso","milagroso","motivador","necesario","nuevo","oficial","perfecto","apasionado","persuasivo","fenomenal","placer","popular","poder","prestigioso","prodigioso","profundo","pr\u00f3spero","poderoso","calidad","radiante","r\u00e1pido","exitoso","revolucionario","satisfecho","seguridad","sensacional","sereno","suntuoso","espl\u00e9ndido","sublime","sorprendente","talentoso","terror\u00edfico","\u00fanico","valor","vibrante","victorioso","vivo","verdaderamente","celoso","aut\u00e9ntico","aventurero","espectacular","exclusivo","garantizado","extraordinario","fabuloso","fascinante","formidable","genial","grandioso","gratuito","h\u00e1bil","ilimitado","impecable","infalible","infinitamente","influyente","ingenioso","inolvidable","irremplazable","l\u00edder","maestro","notable","novedoso","pionero","poderoso","reconocido","revolucionario","sorprendente","superior","triunfante","ultra","valiente","valioso","vanguardista","vigoroso","visionario","voluntad","vital","triunfo","glorioso","imparable","inigualable","inteligente","invencible","libertad","orgullo","paz","progreso","renovado","sabidur\u00eda","satisfacci\u00f3n","seguro","serenidad","superaci\u00f3n","talento","transcendente","transformador","valent\u00eda","victoria"],"diacritics":{"A":"[\\u0041\\u24B6\\uFF21\\u00C0\\u00C1\\u00C2\\u1EA6\\u1EA4\\u1EAA\\u1EA8\\u00C3\\u0100\\u0102\\u1EB0\\u1EAE\\u1EB4\\u1EB2\\u0226\\u01E0\\u00C4\\u01DE\\u1EA2\\u00C5\\u01FA\\u01CD\\u0200\\u0202\\u1EA0\\u1EAC\\u1EB6\\u1E00\\u0104\\u023A\\u2C6F]","AA":"[\\uA732]","AE":"[\\u00C6\\u01FC\\u01E2]","AO":"[\\uA734]","AU":"[\\uA736]","AV":"[\\uA738\\uA73A]","AY":"[\\uA73C]","B":"[\\u0042\\u24B7\\uFF22\\u1E02\\u1E04\\u1E06\\u0243\\u0182\\u0181]","C":"[\\u0043\\u24B8\\uFF23\\u0106\\u0108\\u010A\\u010C\\u00C7\\u1E08\\u0187\\u023B\\uA73E]","D":"[\\u0044\\u24B9\\uFF24\\u1E0A\\u010E\\u1E0C\\u1E10\\u1E12\\u1E0E\\u0110\\u018B\\u018A\\u0189\\uA779]","DZ":"[\\u01F1\\u01C4]","Dz":"[\\u01F2\\u01C5]","E":"[\\u0045\\u24BA\\uFF25\\u00C8\\u00C9\\u00CA\\u1EC0\\u1EBE\\u1EC4\\u1EC2\\u1EBC\\u0112\\u1E14\\u1E16\\u0114\\u0116\\u00CB\\u1EBA\\u011A\\u0204\\u0206\\u1EB8\\u1EC6\\u0228\\u1E1C\\u0118\\u1E18\\u1E1A\\u0190\\u018E]","F":"[\\u0046\\u24BB\\uFF26\\u1E1E\\u0191\\uA77B]","G":"[\\u0047\\u24BC\\uFF27\\u01F4\\u011C\\u1E20\\u011E\\u0120\\u01E6\\u0122\\u01E4\\u0193\\uA7A0\\uA77D\\uA77E]","H":"[\\u0048\\u24BD\\uFF28\\u0124\\u1E22\\u1E26\\u021E\\u1E24\\u1E28\\u1E2A\\u0126\\u2C67\\u2C75\\uA78D]","I":"[\\u0049\\u24BE\\uFF29\\u00CC\\u00CD\\u00CE\\u0128\\u012A\\u012C\\u0130\\u00CF\\u1E2E\\u1EC8\\u01CF\\u0208\\u020A\\u1ECA\\u012E\\u1E2C\\u0197]","J":"[\\u004A\\u24BF\\uFF2A\\u0134\\u0248]","K":"[\\u004B\\u24C0\\uFF2B\\u1E30\\u01E8\\u1E32\\u0136\\u1E34\\u0198\\u2C69\\uA740\\uA742\\uA744\\uA7A2]","L":"[\\u004C\\u24C1\\uFF2C\\u013F\\u0139\\u013D\\u1E36\\u1E38\\u013B\\u1E3C\\u1E3A\\u0141\\u023D\\u2C62\\u2C60\\uA748\\uA746\\uA780]","LJ":"[\\u01C7]","Lj":"[\\u01C8]","M":"[\\u004D\\u24C2\\uFF2D\\u1E3E\\u1E40\\u1E42\\u2C6E\\u019C]","N":"[\\u004E\\u24C3\\uFF2E\\u01F8\\u0143\\u00D1\\u1E44\\u0147\\u1E46\\u0145\\u1E4A\\u1E48\\u0220\\u019D\\uA790\\uA7A4]","NJ":"[\\u01CA]","Nj":"[\\u01CB]","O":"[\\u004F\\u24C4\\uFF2F\\u00D2\\u00D3\\u00D4\\u1ED2\\u1ED0\\u1ED6\\u1ED4\\u00D5\\u1E4C\\u022C\\u1E4E\\u014C\\u1E50\\u1E52\\u014E\\u022E\\u0230\\u00D6\\u022A\\u1ECE\\u0150\\u01D1\\u020C\\u020E\\u01A0\\u1EDC\\u1EDA\\u1EE0\\u1EDE\\u1EE2\\u1ECC\\u1ED8\\u01EA\\u01EC\\u00D8\\u01FE\\u0186\\u019F\\uA74A\\uA74C]","OI":"[\\u01A2]","OO":"[\\uA74E]","OU":"[\\u0222]","P":"[\\u0050\\u24C5\\uFF30\\u1E54\\u1E56\\u01A4\\u2C63\\uA750\\uA752\\uA754]","Q":"[\\u0051\\u24C6\\uFF31\\uA756\\uA758\\u024A]","R":"[\\u0052\\u24C7\\uFF32\\u0154\\u1E58\\u0158\\u0210\\u0212\\u1E5A\\u1E5C\\u0156\\u1E5E\\u024C\\u2C64\\uA75A\\uA7A6\\uA782]","S":"[\\u0053\\u24C8\\uFF33\\u1E9E\\u015A\\u1E64\\u015C\\u1E60\\u0160\\u1E66\\u1E62\\u1E68\\u0218\\u015E\\u2C7E\\uA7A8\\uA784]","T":"[\\u0054\\u24C9\\uFF34\\u1E6A\\u0164\\u1E6C\\u021A\\u0162\\u1E70\\u1E6E\\u0166\\u01AC\\u01AE\\u023E\\uA786]","TZ":"[\\uA728]","U":"[\\u0055\\u24CA\\uFF35\\u00D9\\u00DA\\u00DB\\u0168\\u1E78\\u016A\\u1E7A\\u016C\\u00DC\\u01DB\\u01D7\\u01D5\\u01D9\\u1EE6\\u016E\\u0170\\u01D3\\u0214\\u0216\\u01AF\\u1EEA\\u1EE8\\u1EEE\\u1EEC\\u1EF0\\u1EE4\\u1E72\\u0172\\u1E76\\u1E74\\u0244]","V":"[\\u0056\\u24CB\\uFF36\\u1E7C\\u1E7E\\u01B2\\uA75E\\u0245]","VY":"[\\uA760]","W":"[\\u0057\\u24CC\\uFF37\\u1E80\\u1E82\\u0174\\u1E86\\u1E84\\u1E88\\u2C72]","X":"[\\u0058\\u24CD\\uFF38\\u1E8A\\u1E8C]","Y":"[\\u0059\\u24CE\\uFF39\\u1EF2\\u00DD\\u0176\\u1EF8\\u0232\\u1E8E\\u0178\\u1EF6\\u1EF4\\u01B3\\u024E\\u1EFE]","Z":"[\\u005A\\u24CF\\uFF3A\\u0179\\u1E90\\u017B\\u017D\\u1E92\\u1E94\\u01B5\\u0224\\u2C7F\\u2C6B\\uA762]","a":"[\\u0061\\u24D0\\uFF41\\u1E9A\\u00E0\\u00E1\\u00E2\\u1EA7\\u1EA5\\u1EAB\\u1EA9\\u00E3\\u0101\\u0103\\u1EB1\\u1EAF\\u1EB5\\u1EB3\\u0227\\u01E1\\u00E4\\u01DF\\u1EA3\\u00E5\\u01FB\\u01CE\\u0201\\u0203\\u1EA1\\u1EAD\\u1EB7\\u1E01\\u0105\\u2C65\\u0250]","aa":"[\\uA733]","ae":"[\\u00E6\\u01FD\\u01E3]","ao":"[\\uA735]","au":"[\\uA737]","av":"[\\uA739\\uA73B]","ay":"[\\uA73D]","b":"[\\u0062\\u24D1\\uFF42\\u1E03\\u1E05\\u1E07\\u0180\\u0183\\u0253]","c":"[\\u0063\\u24D2\\uFF43\\u0107\\u0109\\u010B\\u010D\\u00E7\\u1E09\\u0188\\u023C\\uA73F\\u2184]","d":"[\\u0064\\u24D3\\uFF44\\u1E0B\\u010F\\u1E0D\\u1E11\\u1E13\\u1E0F\\u0111\\u018C\\u0256\\u0257\\uA77A]","dz":"[\\u01F3\\u01C6]","e":"[\\u0065\\u24D4\\uFF45\\u00E8\\u00E9\\u00EA\\u1EC1\\u1EBF\\u1EC5\\u1EC3\\u1EBD\\u0113\\u1E15\\u1E17\\u0115\\u0117\\u00EB\\u1EBB\\u011B\\u0205\\u0207\\u1EB9\\u1EC7\\u0229\\u1E1D\\u0119\\u1E19\\u1E1B\\u0247\\u025B\\u01DD]","f":"[\\u0066\\u24D5\\uFF46\\u1E1F\\u0192\\uA77C]","g":"[\\u0067\\u24D6\\uFF47\\u01F5\\u011D\\u1E21\\u011F\\u0121\\u01E7\\u0123\\u01E5\\u0260\\uA7A1\\u1D79\\uA77F]","h":"[\\u0068\\u24D7\\uFF48\\u0125\\u1E23\\u1E27\\u021F\\u1E25\\u1E29\\u1E2B\\u1E96\\u0127\\u2C68\\u2C76\\u0265]","hv":"[\\u0195]","i":"[\\u0069\\u24D8\\uFF49\\u00EC\\u00ED\\u00EE\\u0129\\u012B\\u012D\\u00EF\\u1E2F\\u1EC9\\u01D0\\u0209\\u020B\\u1ECB\\u012F\\u1E2D\\u0268\\u0131]","j":"[\\u006A\\u24D9\\uFF4A\\u0135\\u01F0\\u0249]","k":"[\\u006B\\u24DA\\uFF4B\\u1E31\\u01E9\\u1E33\\u0137\\u1E35\\u0199\\u2C6A\\uA741\\uA743\\uA745\\uA7A3]","l":"[\\u006C\\u24DB\\uFF4C\\u0140\\u013A\\u013E\\u1E37\\u1E39\\u013C\\u1E3D\\u1E3B\\u017F\\u0142\\u019A\\u026B\\u2C61\\uA749\\uA781\\uA747]","lj":"[\\u01C9]","m":"[\\u006D\\u24DC\\uFF4D\\u1E3F\\u1E41\\u1E43\\u0271\\u026F]","n":"[\\u006E\\u24DD\\uFF4E\\u01F9\\u0144\\u00F1\\u1E45\\u0148\\u1E47\\u0146\\u1E4B\\u1E49\\u019E\\u0272\\u0149\\uA791\\uA7A5]","nj":"[\\u01CC]","o":"[\\u006F\\u24DE\\uFF4F\\u00F2\\u00F3\\u00F4\\u1ED3\\u1ED1\\u1ED7\\u1ED5\\u00F5\\u1E4D\\u022D\\u1E4F\\u014D\\u1E51\\u1E53\\u014F\\u022F\\u0231\\u00F6\\u022B\\u1ECF\\u0151\\u01D2\\u020D\\u020F\\u01A1\\u1EDD\\u1EDB\\u1EE1\\u1EDF\\u1EE3\\u1ECD\\u1ED9\\u01EB\\u01ED\\u00F8\\u01FF\\u0254\\uA74B\\uA74D\\u0275]","oi":"[\\u01A3]","ou":"[\\u0223]","oo":"[\\uA74F]","p":"[\\u0070\\u24DF\\uFF50\\u1E55\\u1E57\\u01A5\\u1D7D\\uA751\\uA753\\uA755]","q":"[\\u0071\\u24E0\\uFF51\\u024B\\uA757\\uA759]","r":"[\\u0072\\u24E1\\uFF52\\u0155\\u1E59\\u0159\\u0211\\u0213\\u1E5B\\u1E5D\\u0157\\u1E5F\\u024D\\u027D\\uA75B\\uA7A7\\uA783]","s":"[\\u0073\\u24E2\\uFF53\\u015B\\u1E65\\u015D\\u1E61\\u0161\\u1E67\\u1E63\\u1E69\\u0219\\u015F\\u023F\\uA7A9\\uA785\\u1E9B]","ss":"[\\u00DF]","t":"[\\u0074\\u24E3\\uFF54\\u1E6B\\u1E97\\u0165\\u1E6D\\u021B\\u0163\\u1E71\\u1E6F\\u0167\\u01AD\\u0288\\u2C66\\uA787]","tz":"[\\uA729]","u":"[\\u0075\\u24E4\\uFF55\\u00F9\\u00FA\\u00FB\\u0169\\u1E79\\u016B\\u1E7B\\u016D\\u00FC\\u01DC\\u01D8\\u01D6\\u01DA\\u1EE7\\u016F\\u0171\\u01D4\\u0215\\u0217\\u01B0\\u1EEB\\u1EE9\\u1EEF\\u1EED\\u1EF1\\u1EE5\\u1E73\\u0173\\u1E77\\u1E75\\u0289]","v":"[\\u0076\\u24E5\\uFF56\\u1E7D\\u1E7F\\u028B\\uA75F\\u028C]","vy":"[\\uA761]","w":"[\\u0077\\u24E6\\uFF57\\u1E81\\u1E83\\u0175\\u1E87\\u1E85\\u1E98\\u1E89\\u2C73]","x":"[\\u0078\\u24E7\\uFF58\\u1E8B\\u1E8D]","y":"[\\u0079\\u24E8\\uFF59\\u1EF3\\u00FD\\u0177\\u1EF9\\u0233\\u1E8F\\u00FF\\u1EF7\\u1E99\\u1EF5\\u01B4\\u024F\\u1EFF]","z":"[\\u007A\\u24E9\\uFF5A\\u017A\\u1E91\\u017C\\u017E\\u1E93\\u1E95\\u01B6\\u0225\\u0240\\u2C6C\\uA763]"},"researchesTests":["contentHasTOC","contentHasShortParagraphs","contentHasAssets","keywordInTitle","keywordInMetaDescription","keywordInPermalink","keywordIn10Percent","keywordInContent","keywordInSubheadings","keywordInImageAlt","keywordDensity","keywordNotUsed","lengthContent","lengthPermalink","linksHasInternal","linksHasExternals","linksNotAllExternals","titleStartWithKeyword","titleSentiment","titleHasPowerWords","titleHasNumber","hasContentAI"],"hasRedirection":true,"hasBreadcrumb":true},"homeUrl":"https:\/\/yamuparkoti.com\/es","objectID":3028,"objectType":"post","locale":"es","localeFull":"es_ES","overlayImages":{"play":{"name":"Icono de reproducci\u00f3n","url":"https:\/\/yamuparkoti.com\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-play.png","path":"\/home\/u575838537\/domains\/yamuparkoti.com\/public_html\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-play.png","position":"middle_center"},"gif":{"name":"Icono GIF","url":"https:\/\/yamuparkoti.com\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-gif.png","path":"\/home\/u575838537\/domains\/yamuparkoti.com\/public_html\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-gif.png","position":"middle_center"}},"defautOgImage":"https:\/\/yamuparkoti.com\/wp-content\/uploads\/2024\/08\/Untitled_design1.png","customPermalinks":true,"isUserRegistered":true,"autoSuggestKeywords":true,"connectSiteUrl":"https:\/\/rankmath.com\/auth?site=https%3A%2F%2Fyamuparkoti.com%2Fes&r=https%3A%2F%2Fyamuparkoti.com%2Fes%2Fwp-json%2Fwp%2Fv2%2Fpages%2F3028%3Fnonce%3Dc9791f3fd8&pro=1","maxTags":100,"trendsIcon":"<svg viewBox=\"0 0 610 610\"><path d=\"M18.85,446,174.32,290.48l58.08,58.08L76.93,504a14.54,14.54,0,0,1-20.55,0L18.83,466.48a14.54,14.54,0,0,1,0-20.55Z\" style=\"fill:#4285f4\"\/><path d=\"M242.65,242.66,377.59,377.6l-47.75,47.75a14.54,14.54,0,0,1-20.55,0L174.37,290.43l47.75-47.75A14.52,14.52,0,0,1,242.65,242.66Z\" style=\"fill:#ea4335\"\/><polygon points=\"319.53 319.53 479.26 159.8 537.34 217.88 377.61 377.62 319.53 319.53\" style=\"fill:#fabb05\"\/><path d=\"M594.26,262.73V118.61h0a16.94,16.94,0,0,0-16.94-16.94H433.2a16.94,16.94,0,0,0-12,28.92L565.34,274.71h0a16.94,16.94,0,0,0,28.92-12Z\" style=\"fill:#34a853\"\/><rect width=\"610\" height=\"610\" style=\"fill:none\"\/><\/svg>","showScore":true,"siteFavIcon":"https:\/\/yamuparkoti.com\/wp-content\/uploads\/2024\/08\/cropped-Untitled_design1-32x32.png","canUser":{"general":false,"advanced":false,"snippet":false,"social":false,"analysis":false,"analytics":false,"content_ai":false},"showKeywordIntent":true,"isPro":true,"is_front_page":false,"trendsUpgradeLink":"https:\/\/rankmath.com\/pricing\/?utm_source=Plugin&utm_medium=CE%20General%20Tab%20Trends&utm_campaign=WP","trendsUpgradeLabel":"Actualizar","trendsPreviewImage":"https:\/\/yamuparkoti.com\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/trends-preview.jpg","currentEditor":false,"homepageData":{"assessor":{"powerWords":["incre\u00edble","asombroso","maravilloso","\u00fanico","hermoso","felicidad","brillante","cautivador","carism\u00e1tico","impactante","claro","completamente","confidencial","confianza","significativo","creativo","definitivamente","delicioso","demostrar","apres\u00farate","decidido","digno","din\u00e1mico","impresionante","esencial","inspirador","innovador","intenso","eficaz","m\u00e1gico","magn\u00edfico","hist\u00f3rico","importante","incre\u00edble","indispensable","inolvidable","irresistible","legendario","luminoso","lujo","m\u00e1gico","magn\u00edfico","majestuoso","memorable","maravilloso","milagroso","motivador","necesario","nuevo","oficial","perfecto","apasionado","persuasivo","fenomenal","placer","popular","poder","prestigioso","prodigioso","profundo","pr\u00f3spero","poderoso","calidad","radiante","r\u00e1pido","exitoso","revolucionario","satisfecho","seguridad","sensacional","sereno","suntuoso","espl\u00e9ndido","sublime","sorprendente","talentoso","terror\u00edfico","\u00fanico","valor","vibrante","victorioso","vivo","verdaderamente","celoso","aut\u00e9ntico","aventurero","espectacular","exclusivo","garantizado","extraordinario","fabuloso","fascinante","formidable","genial","grandioso","gratuito","h\u00e1bil","ilimitado","impecable","infalible","infinitamente","influyente","ingenioso","inolvidable","irremplazable","l\u00edder","maestro","notable","novedoso","pionero","poderoso","reconocido","revolucionario","sorprendente","superior","triunfante","ultra","valiente","valioso","vanguardista","vigoroso","visionario","voluntad","vital","triunfo","glorioso","imparable","inigualable","inteligente","invencible","libertad","orgullo","paz","progreso","renovado","sabidur\u00eda","satisfacci\u00f3n","seguro","serenidad","superaci\u00f3n","talento","transcendente","transformador","valent\u00eda","victoria"],"diacritics":true,"researchesTests":["contentHasTOC","contentHasShortParagraphs","contentHasAssets","keywordInTitle","keywordInMetaDescription","keywordInPermalink","keywordIn10Percent","keywordInContent","keywordInSubheadings","keywordInImageAlt","keywordDensity","keywordNotUsed","lengthContent","lengthPermalink","linksHasInternal","linksHasExternals","linksNotAllExternals","titleStartWithKeyword","titleSentiment","titleHasPowerWords","titleHasNumber","hasContentAI"],"hasBreadcrumb":true,"serpData":{"title":"%sitename% %page% %sep% %sitedesc%","description":"","titleTemplate":"%sitename% %page% %sep% %sitedesc%","descriptionTemplate":"","focusKeywords":"","breadcrumbTitle":"Home","robots":{"index":true},"advancedRobots":{"max-snippet":"-1","max-video-preview":"-1","max-image-preview":"large"},"facebookTitle":"","facebookDescription":"","facebookImage":"","facebookImageID":""}}},"searchIntents":[],"isAnalyticsConnected":false,"tocTitle":"Table of Contents","tocExcludeHeadings":[],"listStyle":"ul"},"_links":{"self":[{"href":"https:\/\/yamuparkoti.com\/es\/wp-json\/wp\/v2\/pages\/3028","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yamuparkoti.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/yamuparkoti.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/yamuparkoti.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/yamuparkoti.com\/es\/wp-json\/wp\/v2\/comments?post=3028"}],"version-history":[{"count":0,"href":"https:\/\/yamuparkoti.com\/es\/wp-json\/wp\/v2\/pages\/3028\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/yamuparkoti.com\/es\/wp-json\/wp\/v2\/media\/3448"}],"wp:attachment":[{"href":"https:\/\/yamuparkoti.com\/es\/wp-json\/wp\/v2\/media?parent=3028"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}