JPG2PNG Pro – Convert with Transparency
/* — CSS SEPARATION START — */
@import url(‘https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600;700&display=swap’);:root {
–primary: #8B5CF6; /* Violet-500 */
–bg-dark: #111827;
}body {
font-family: ‘Inter’, sans-serif;
transition: background-color 0.3s, color 0.3s;
}/* Checkerboard pattern for PNG preview */
.checkerboard-bg {
background-color: #ffffff;
background-image: linear-gradient(45deg, #e5e7eb 25%, transparent 25%),
linear-gradient(-45deg, #e5e7eb 25%, transparent 25%),
linear-gradient(45deg, transparent 75%, #e5e7eb 75%),
linear-gradient(-45deg, transparent 75%, #e5e7eb 75%);
background-size: 10px 10px;
background-position: 0 0, 0 5px, 5px -5px, -5px 0px;
}
.dark .checkerboard-bg {
background-color: #374151;
background-image: linear-gradient(45deg, #4b5563 25%, transparent 25%),
linear-gradient(-45deg, #4b5563 25%, transparent 25%),
linear-gradient(45deg, transparent 75%, #4b5563 75%),
linear-gradient(-45deg, transparent 75%, #4b5563 75%);
}/* Loading Spinner */
.loader {
border: 3px solid #f3f3f3;
border-radius: 50%;
border-top: 3px solid #8B5CF6;
width: 20px;
height: 20px;
animation: spin 1s linear infinite;
}@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}/* Dropzone Active */
.dropzone-active {
border-color: #8B5CF6 !important;
background-color: rgba(139, 92, 246, 0.1) !important;
}/* Dark Mode */
.dark body {
background-color: var(–bg-dark);
color: #F9FAFB;
}
.dark .card {
background-color: #1F2937;
border-color: #374151;
}
.dark input, .dark select {
background-color: #374151;
color: white;
border-color: #4B5563;
}
/* — CSS SEPARATION END — */
tailwind.config = {
darkMode: ‘class’,
theme: {
extend: {
colors: {
primary: ‘#8B5CF6’,
}
}
}
}
Transform JPGs into high-quality, lossless PNGs. Optionally remove simple backgrounds to create transparent images instantly.
Magic Options Remove a specific color to create a transparent background.
Color to Remove
White Background
Black Background
Custom Color…
Tolerance (Fuzz)
Strict
Loose
Why PNG? PNGs are lossless, meaning they don’t lose quality when saved repeatedly. They are the standard for images requiring transparency.
Clear All Files
Drop JPG files here Batch processing enabled
Browse JPGs
// — JAVASCRIPT SEPARATION START —// Elements
const dropzone = document.getElementById(‘dropzone’);
const fileInput = document.getElementById(‘fileInput’);
const resultsArea = document.getElementById(‘results-area’);
const resultsList = document.getElementById(‘results-list’);
const countBadge = document.getElementById(‘count-badge’);
const canvas = document.getElementById(‘process-canvas’);
const ctx = canvas.getContext(‘2d’);
// Controls
const toggleTransparency = document.getElementById(‘toggle-transparency’);
const transparencyControls = document.getElementById(‘transparency-controls’);
const removeSelect = document.getElementById(‘remove-select’);
const removeColor = document.getElementById(‘remove-color’);
const toleranceSlider = document.getElementById(‘tolerance’);let processedCount = 0;
let isDarkMode = false;// — Event Listeners —
dropzone.addEventListener(‘click’, () => fileInput.click());
dropzone.addEventListener(‘dragover’, (e) => {
e.preventDefault();
dropzone.classList.add(‘dropzone-active’);
});
dropzone.addEventListener(‘dragleave’, () => dropzone.classList.remove(‘dropzone-active’));
dropzone.addEventListener(‘drop’, (e) => {
e.preventDefault();
dropzone.classList.remove(‘dropzone-active’);
if(e.dataTransfer.files.length) handleFiles(e.dataTransfer.files);
});
fileInput.addEventListener(‘change’, (e) => {
if(e.target.files.length) handleFiles(e.target.files);
});// Toggle Controls
toggleTransparency.addEventListener(‘change’, (e) => {
if(e.target.checked) {
transparencyControls.classList.remove(‘opacity-50’, ‘pointer-events-none’);
} else {
transparencyControls.classList.add(‘opacity-50’, ‘pointer-events-none’);
}
});// Color Sync
removeSelect.addEventListener(‘change’, () => {
if(removeSelect.value !== ‘custom’) removeColor.value = removeSelect.value;
});
removeColor.addEventListener(‘input’, () => {
removeSelect.value = ‘custom’;
});// — Processing —function handleFiles(files) {
resultsArea.classList.remove(‘hidden’);
Array.from(files).forEach(file => {
if(file.type.match(‘image.*’)) {
processImage(file);
} else {
alert(‘Skipped invalid file: ‘ + file.name);
}
});
}function processImage(file) {
const uiId = ‘item-‘ + Math.random().toString(36).substr(2, 9);
createItemUI(uiId, file);const reader = new FileReader();
reader.onload = (e) => {
const img = new Image();
img.onload = () => {
convertToPNG(img, uiId, file.name);
};
img.src = e.target.result;
};
reader.readAsDataURL(file);
}function createItemUI(id, file) {
const div = document.createElement(‘div’);
div.id = id;
div.className = ‘card bg-white dark:bg-gray-800 p-3 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 flex items-center gap-4’;
div.innerHTML = `
${file.name}
${formatBytes(file.size)}
Converting…
`;
resultsList.prepend(div);
}function convertToPNG(img, id, originalName) {
// Canvas Setup
canvas.width = img.width;
canvas.height = img.height;
ctx.drawImage(img, 0, 0);// Transparency Logic
if (toggleTransparency.checked) {
applyTransparency();
}// Export as PNG
canvas.toBlob((blob) => {
updateItemUI(id, blob, originalName, img.src);
}, ‘image/png’);
}function applyTransparency() {
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
const data = imageData.data;
// Get Target RGB
const hex = removeColor.value;
const targetR = parseInt(hex.substr(1, 2), 16);
const targetG = parseInt(hex.substr(3, 2), 16);
const targetB = parseInt(hex.substr(5, 2), 16);
const tol = parseInt(toleranceSlider.value); // 1-100for (let i = 0; i < data.length; i += 4) {
const r = data[i];
const g = data[i + 1];
const b = data[i + 2];// Simple distance check
// More robust would be DeltaE in Lab space, but RGB distance is fast for browser
if (Math.abs(r – targetR) < tol &&
Math.abs(g – targetG) < tol &&
Math.abs(b – targetB) < tol) {
data[i + 3] = 0; // Set Alpha to 0
}
}
ctx.putImageData(imageData, 0, 0);
}function updateItemUI(id, blob, originalName, originalSrc) {
const div = document.getElementById(id);
if(!div) return;const url = URL.createObjectURL(blob);
const newName = originalName.replace(/\.[^/.]+$/, "") + ".png";
div.innerHTML = `
${newName}
JPG
PNG
${formatBytes(blob.size)}
Save
`;
processedCount++;
countBadge.innerText = processedCount;
}function formatBytes(bytes) {
if(bytes === 0) return ‘0 Bytes’;
const k = 1024;
const sizes = [‘Bytes’, ‘KB’, ‘MB’];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ‘ ‘ + sizes[i];
}function clearAll() {
resultsList.innerHTML = ”;
resultsArea.classList.add(‘hidden’);
processedCount = 0;
countBadge.innerText = ‘0’;
fileInput.value = ”;
}function toggleDarkMode() {
isDarkMode = !isDarkMode;
document.documentElement.classList.toggle(‘dark’);
const icon = document.getElementById(‘theme-icon’);
icon.classList.toggle(‘fa-moon’, !isDarkMode);
icon.classList.toggle(‘fa-sun’, isDarkMode);
}// Custom Switch Styling
const style = document.createElement(‘style’);
style.innerHTML = `
.toggle-checkbox:checked {
right: 0;
border-color: #8B5CF6;
}
.toggle-checkbox:checked + .toggle-label {
background-color: #8B5CF6;
}
`;
document.head.appendChild(style);// — JAVASCRIPT SEPARATION END —
Using JPG to PNG The JPG to PNG utility is designed for image and graphics tasks. Check the on-page controls for available formats, limits and options. Always review the output for accuracy before sharing or publishing it.
Practical tips Keep your original files or source information as a backup. Choose suitable options using the controls provided by this tool. Check the generated result and retry with different settings if needed. Explore related tools Image Compressor and Image Resizer are available for related tasks.