My Blog https://artstun.com My WordPress Blog Fri, 19 Jun 2026 09:55:07 +0000 en-US hourly 1 https://wordpress.org/?v=7.0 Online Video converter https://artstun.com/online-video-converter/ Sun, 07 Jun 2026 06:52:01 +0000 https://artstun.com/?p=581

Artstun.com

📱 Safe Video Converter

Optimized for browser stability. Maximum file size: 100 MB.

0%
⬇ Download Output

🎬 Media Converter

⚡ Lite Mode (Convert)
🛠 Advanced Mode (Edit)
High-Quality Conversion

Converts your video directly to a standard format without losing quality.

0%
⬇ Download Output
]]>
Read Aloud” (text-to-speech) https://artstun.com/read-aloud-text-to-speech/ Fri, 05 Jun 2026 18:30:48 +0000 https://artstun.com/?p=532

Artstun.com

📁 Drag & Drop PDF, DOCX, or Images

Awaiting document or text…
Upload a File or Paste Text to begin.

Note on Scanned Files: If your PDF is a scanned photo, check the “Deep Scan” box to enable AI text reading.

Watermarks: Use the filter box at the top to skip over repeated website links or copyright text!
]]>
Print adjusted Crop and split https://artstun.com/print-adjusted-crop-and-split/ Tue, 26 May 2026 18:36:27 +0000 https://artstun.com/?p=508 <style> /* Scoped CSS to prevent conflicts with WordPress themes */ #image-splitter-tool { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; background: #f9f9f9; border: 1px solid #ddd; border-radius: 8px; display: flex; flex-wrap: wrap; gap: 20px; padding: 20px; box-sizing: border-box; max-width: 100%; color: #333; } #image-splitter-tool .controls { flex: 1; min-width: 280px; background: #fff; padding: 20px; border-radius: 6px; box-shadow: 0 2px 5px rgba(0,0,0,0.05); } #image-splitter-tool .preview-section { flex: 2; min-width: 300px; display: flex; flex-direction: column; } #image-splitter-tool .control-group { margin-bottom: 15px; } #image-splitter-tool label { display: block; font-weight: 600; margin-bottom: 5px; font-size: 13px; } #image-splitter-tool input[type="number"], #image-splitter-tool select, #image-splitter-tool input[type="file"] { width: 100%; padding: 8px; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; background: #fff; } #image-splitter-tool .flex-row { display: flex; gap: 10px; margin-top: 8px; } #image-splitter-tool .btn { background: #2271b1; color: #fff; border: none; padding: 12px 15px; font-size: 15px; font-weight: 600; border-radius: 4px; cursor: pointer; width: 100%; transition: background 0.2s; margin-top: 10px; } #image-splitter-tool .btn:hover { background: #135e96; } #image-splitter-tool .workspace-wrapper { width: 100%; height: 550px; overflow: auto; background: #d5d5d5; border: 1px solid #ccc; position: relative; border-radius: 4px; box-shadow: inset 0 0 10px rgba(0,0,0,0.1); } #image-splitter-tool .workspace { background: #fff; position: relative; transform-origin: top left; box-shadow: 0 0 15px rgba(0,0,0,0.2); overflow: hidden; margin: 20px; z-index: 1; } #image-splitter-tool #placeholder-text { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: #999; font-weight: bold; pointer-events: none; font-size: 20px; z-index: 5; } /* CRITICAL OVERRIDES FOR WORDPRESS THEMES */ #image-splitter-tool #draggable-image { position: absolute; top: 0; left: 0; cursor: grab; opacity: 0.85; user-select: none; transform-origin: top left; z-index: 10; max-width: none !important; max-height: none !important; border: none !important; padding: 0 !important; margin: 0 !important; } #image-splitter-tool #draggable-image:active { cursor: grabbing; } #image-splitter-tool .grid-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; border: 2px solid #007cba; z-index: 20; } </style> <div id="image-splitter-tool"> <div class="controls"> <h3 style="margin-top:0;">Image Splitter Tool</h3> <div class="control-group"> <label>1. Upload Image</label> <input type="file" id="split-img-upload" accept="image/*"> </div> <div class="control-group"> <label>2. Desired Base Size (in CM)</label> <select id="size-preset"> <option value="custom">Custom Size</option> <option value="a4" data-w="29.7" data-h="21">A4 (29.7 x 21 cm)</option> <option value="a3" data-w="42" data-h="29.7">A3 (42 x 29.7 cm)</option> <option value="a2" data-w="59.4" data-h="42">A2 (59.4 x 42 cm)</option> <option value="a1" data-w="84" data-h="59.4">A1 (84.0 x 59.4 cm)</option> <option value="a0" data-w="118.8" data-h="84">A0 (118.8 x 84.0 cm)</option> <option value="2a0" data-w="168" data-h="118.8">2A0 (168.0 x 118.8 cm)</option> </select> <div class="flex-row"> <input type="number" id="img-width-cm" placeholder="Width" value="29.7" step="0.1"> <input type="number" id="img-height-cm" placeholder="Height" value="21" step="0.1"> </div> </div> <div class="control-group" style="background: #f0f6fc; padding: 10px; border-radius: 4px; border: 1px solid #c8dcf0;"> <label style="color:#007cba;">Manual Adjustment (Scale Image)</label> <input type="range" id="img-scale" min="0.1" max="3" step="0.01" value="1"> <small style="display:block; text-align:center; color:#666; margin-top:5px;">Drag the image in the preview area to reposition</small> </div> <div class="control-group"> <label>3. Target Grid (29.7cm x 21cm slices)</label> <div class="flex-row"> <input type="number" id="grid-cols" placeholder="Cols" value="1" min="1"> <input type="number" id="grid-rows" placeholder="Rows" value="1" min="1"> </div> </div> <div class="control-group"> <label>4. Print Orientation</label> <select id="grid-rotation"> <option value="landscape">Landscape Slices (29.7W x 21H)</option> <option value="portrait">Portrait Slices (21W x 29.7H)</option> </select> </div> <div class="control-group"> <label>Workspace Zoom (Viewing only)</label> <input type="range" id="preview-zoom" min="0.1" max="1" step="0.05" value="0.4"> </div> <button class="btn" id="btn-export">Split & Download Images</button> </div> <div class="preview-section"> <label>Workspace / Preview</label> <div class="workspace-wrapper" id="workspace-wrapper"> <div class="workspace" id="workspace"> <div id="placeholder-text">Upload an image to start</div> <img id="draggable-image" src="" style="display:none;"> <div class="grid-overlay" id="grid-overlay"></div> </div> </div> </div> </div> <script> document.addEventListener("DOMContentLoaded", function() { const PX_PER_CM = 40; // Elements const uploadInput = document.getElementById('split-img-upload'); const presetInput = document.getElementById('size-preset'); const imgWidthInput = document.getElementById('img-width-cm'); const imgHeightInput = document.getElementById('img-height-cm'); const imgScaleInput = document.getElementById('img-scale'); const gridColsInput = document.getElementById('grid-cols'); const gridRowsInput = document.getElementById('grid-rows'); const gridRotation = document.getElementById('grid-rotation'); const zoomInput = document.getElementById('preview-zoom'); const workspace = document.getElementById('workspace'); const gridOverlay = document.getElementById('grid-overlay'); const draggableImg = document.getElementById('draggable-image'); const placeholderText = document.getElementById('placeholder-text'); const exportBtn = document.getElementById('btn-export'); let currentImgObj = new Image(); let isDragging = false; let startX, startY, initialLeft, initialTop; let currentZoom = parseFloat(zoomInput.value); // Reset input on click so user can re-upload the same file if needed uploadInput.addEventListener('click', function() { this.value = null; }); // 1. Upload & Safe Load Sequence uploadInput.addEventListener('change', function(e) { const file = e.target.files[0]; if(!file) return; placeholderText.style.display = 'block'; placeholderText.innerText = "Loading image..."; const reader = new FileReader(); reader.onload = function(event) { currentImgObj.onload = function() { draggableImg.src = currentImgObj.src; draggableImg.style.display = 'block'; placeholderText.style.display = 'none'; // Center the image initially draggableImg.style.left = '0px'; draggableImg.style.top = '0px'; imgScaleInput.value = 1; updateWorkspace(); }; currentImgObj.onerror = function() { alert("There was an error loading the image file. Please try another image."); placeholderText.innerText = "Upload an image to start"; }; currentImgObj.src = event.target.result; }; reader.readAsDataURL(file); }); // 2. Presets presetInput.addEventListener('change', function(e) { if(e.target.value !== 'custom') { const selectedOpt = e.target.options[e.target.selectedIndex]; imgWidthInput.value = selectedOpt.getAttribute('data-w'); imgHeightInput.value = selectedOpt.getAttribute('data-h'); updateWorkspace(); } }); [imgWidthInput, imgHeightInput].forEach(input => { input.addEventListener('input', function() { presetInput.value = 'custom'; }); }); // 3. Main Workspace Logic function updateWorkspace() { const cols = parseInt(gridColsInput.value) || 1; const rows = parseInt(gridRowsInput.value) || 1; const isPortrait = gridRotation.value === 'portrait'; // Define standard cell size const cellWidthCM = isPortrait ? 21 : 29.7; const cellHeightCM = isPortrait ? 29.7 : 21; // Calculate workspace size const cellWidthPX = cellWidthCM * PX_PER_CM; const cellHeightPX = cellHeightCM * PX_PER_CM; const totalWidthPX = cellWidthPX * cols; const totalHeightPX = cellHeightPX * rows; workspace.style.width = totalWidthPX + 'px'; workspace.style.height = totalHeightPX + 'px'; // Draw clear grid lines gridOverlay.style.backgroundSize = `${cellWidthPX}px ${cellHeightPX}px`; gridOverlay.style.backgroundImage = ` linear-gradient(to right, rgba(0, 124, 186, 0.8) 2px, transparent 2px), linear-gradient(to bottom, rgba(0, 124, 186, 0.8) 2px, transparent 2px) `; // Update uploaded image size & scale only if an image is loaded if (currentImgObj.src) { const baseImgW = parseFloat(imgWidthInput.value) * PX_PER_CM; const baseImgH = parseFloat(imgHeightInput.value) * PX_PER_CM; const scale = parseFloat(imgScaleInput.value); if(baseImgW && baseImgH) { draggableImg.style.width = (baseImgW * scale) + 'px'; draggableImg.style.height = (baseImgH * scale) + 'px'; } } applyZoom(); } function applyZoom() { currentZoom = parseFloat(zoomInput.value); workspace.style.transform = `scale(${currentZoom})`; } // 4. Drag Logic draggableImg.addEventListener('mousedown', function(e) { e.preventDefault(); isDragging = true; startX = e.clientX; startY = e.clientY; initialLeft = parseFloat(draggableImg.style.left) || 0; initialTop = parseFloat(draggableImg.style.top) || 0; draggableImg.style.opacity = '0.6'; }); window.addEventListener('mousemove', function(e) { if(!isDragging) return; const dx = (e.clientX - startX) / currentZoom; const dy = (e.clientY - startY) / currentZoom; draggableImg.style.left = (initialLeft + dx) + 'px'; draggableImg.style.top = (initialTop + dy) + 'px'; }); window.addEventListener('mouseup', function() { if(isDragging) { isDragging = false; draggableImg.style.opacity = '0.85'; } }); // 5. Export exportBtn.addEventListener('click', async function() { if(draggableImg.style.display === 'none' || !draggableImg.src) { alert('Please upload an image first.'); return; } exportBtn.innerText = "Processing..."; exportBtn.disabled = true; const cols = parseInt(gridColsInput.value) || 1; const rows = parseInt(gridRowsInput.value) || 1; const isPortrait = gridRotation.value === 'portrait'; const cellWidthPX = (isPortrait ? 21 : 29.7) * PX_PER_CM; const cellHeightPX = (isPortrait ? 29.7 : 21) * PX_PER_CM; const imgLeft = parseFloat(draggableImg.style.left) || 0; const imgTop = parseFloat(draggableImg.style.top) || 0; const finalImgW = parseFloat(draggableImg.style.width); const finalImgH = parseFloat(draggableImg.style.height); const sleep = ms => new Promise(r => setTimeout(r, ms)); for(let r = 0; r < rows; r++) { for(let c = 0; c < cols; c++) { const canvas = document.createElement('canvas'); canvas.width = cellWidthPX; canvas.height = cellHeightPX; const ctx = canvas.getContext('2d'); // Fill with white for empty background ctx.fillStyle = "#ffffff"; ctx.fillRect(0, 0, cellWidthPX, cellHeightPX); const drawX = imgLeft - (c * cellWidthPX); const drawY = imgTop - (r * cellHeightPX); ctx.drawImage(currentImgObj, drawX, drawY, finalImgW, finalImgH); const link = document.createElement('a'); link.download = `Grid_Row${r+1}_Col${c+1}.jpg`; link.href = canvas.toDataURL('image/jpeg', 0.95); link.click(); await sleep(300); } } exportBtn.innerText = "Split & Download Images"; exportBtn.disabled = false; }); // Event Listeners [imgWidthInput, imgHeightInput, imgScaleInput, gridColsInput, gridRowsInput, gridRotation].forEach(input => { input.addEventListener('input', updateWorkspace); input.addEventListener('change', updateWorkspace); }); zoomInput.addEventListener('input', applyZoom); // Initial setup updateWorkspace(); }); </script> ]]> Image Crop https://artstun.com/image-crop/ Mon, 04 May 2026 12:13:33 +0000 https://artstun.com/?p=474

Crop & Adjust

Active Crop Ratio
Freeform
Image Preview Area
Upload an image to start
]]>
India In-Hand Salary Calculator https://artstun.com/india-in-hand-salary-calculator/ Wed, 15 Apr 2026 13:56:41 +0000 https://artstun.com/?p=231

Artstun.com

India Salary & Wealth Planner v21.1 PRO

Compare Job Offers, Calculate In-Hand Pay & Plan Retirement

Auto-Saved
💾 Your financial plan automatically saves to your browser.

Eligible Deductions (Annual)

Retirement & Net Worth Builder

See real inflation-adjusted wealth mapped to Age 100

🏛 My Current Portfolio (Base Capital)

Add your existing investments. Choose Lumpsum Only (FDs/Bonds) or Lumpsum + SIP (Mutual Funds). Set a Stop Age if you want it to mature early.

Total Present Asset Value: ₹0

🔄 Recurring Cash Flows & Loans

Add monthly incomes (Business/Rent) or expenses (Loans). Enter a Start Date and Tenure to auto-calculate your remaining balance.

💰 Future Lumpsum Injections

Add expected windfalls, bonuses, or property sales to boost your corpus.

🎯 Major Life Goals & Expenses

Enter the Today's Cost. The system will auto-calculate and deduct the inflated future cost based on the target age.

]]>
Painting quotation https://artstun.com/painting-quotation/ Tue, 27 Jan 2026 17:54:05 +0000 https://artstun.com/?p=161

Get an Estimated Artwork Quote

Price updates automatically as you enter details.


Enter details to see price
]]>