Create Your Own Pokémon 30 Years Anniversary Wallpaper

Grab your favorite Pokémon and go!

Celebrating 30 years of Pokémon, time sure flew by since its original release in 1996 in Japan. The Pokémon Company made it more special by creating a special “30 Year” logo for each Pokémon. With over 1,000 logos, there’s a lot to choose. Here at Cat with Monocle, we enjoy giving our audience wallpapers to download for their favorite device. With over 1,000 Pokémon 30 Years logo variations, it’ll take too long for our team to render out a set of sizes. However, how about the fans decide what they want, choose the color, and device size? You are the artist! From a large screen on your desktop or to the small screen on your watch, there’s a size you can use.

Follow the steps below to get your own Pokémon 30 Years anniversary wallpaper. Step one: Choose one Pokémon. Step two: Pick a color (or customize the color). Step three: Choose your size(s). Step four: Generate and download!

About Our Wallpapers

Our wallpapers have no watermarks and why should they? All we ask that you help spread the word about Cat with Monocle so we may continue bring you more news, reviews, custom graphics, and more! If you would like to donate, please contact us as it’ll help keep our servers up and running… or at least give us caffeine to keep us working late nights. For other wallpapers available, be sure to check out our wallpaper page to see the list.


2 Choose Background Color
Swatches
Background:
Custom color

3 Choose Sizes
Preset Sizes 0
|
Selected Image
No image
selected yet
4 Generate & Download
Select an image and at least one size to continue
Generated Wallpapers
`; } else { pageImages.forEach((img) => { const thumb = document.createElement('div'); thumb.className = 'gallery-thumb' + (selectedImage && selectedImage.src === img.src ? ' selected' : ''); thumb.innerHTML = `
${img.name}
`; thumb.addEventListener('click', () => onThumbClick(thumb, img)); grid.appendChild(thumb); }); } // Meta const showingStart = totalFiltered === 0 ? 0 : start + 1; const showingEnd = Math.min(start + perPage, totalFiltered); document.getElementById('metaShowing').textContent = totalFiltered === 0 ? '0' : `${showingStart}–${showingEnd}`; document.getElementById('metaTotal').textContent = totalFiltered.toLocaleString(); renderPagination(totalPages); } function renderPagination(totalPages) { const wrap = document.getElementById('paginationWrap'); const btnsDiv = document.getElementById('pageButtons'); wrap.style.display = totalPages <= 1 ? 'none' : 'flex'; if (totalPages <= 1) return; document.getElementById('prevBtn').disabled = currentPage === 1; document.getElementById('nextBtn').disabled = currentPage === totalPages; // Build page numbers with ellipsis btnsDiv.innerHTML = ''; const pages = getPageNumbers(currentPage, totalPages); pages.forEach(p => { const btn = document.createElement('button'); if (p === '…') { btn.className = 'page-btn ellipsis'; btn.textContent = '…'; } else { btn.className = 'page-btn' + (p === currentPage ? ' active' : ''); btn.textContent = p; btn.addEventListener('click', () => changePage(p)); } btnsDiv.appendChild(btn); }); } function getPageNumbers(current, total) { if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1); const pages = []; pages.push(1); if (current > 3) pages.push('…'); for (let i = Math.max(2, current - 1); i <= Math.min(total - 1, current + 1); i++) pages.push(i); if (current < total - 2) pages.push('…'); pages.push(total); return pages; } function clearSelection() { if (selectedImage && selectedImage.blobURL) URL.revokeObjectURL(selectedImage.blobURL); selectedImage = null; document.getElementById('previewImg').classList.remove('visible'); document.getElementById('previewImg').src = ''; document.getElementById('previewPlaceholder').style.display = ''; document.getElementById('previewMeta').classList.remove('visible'); updateBtn(); } function changePage(p) { const totalPages = Math.ceil(filteredImages.length / perPage); if (p < 1 || p > totalPages) return; clearSelection(); currentPage = p; renderGallery(); document.querySelector('.gallery-section').scrollIntoView({ behavior: 'smooth', block: 'start' }); } function changePerPage(val) { clearSelection(); perPage = parseInt(val); currentPage = 1; renderGallery(); } // ── Search ── const searchInput = document.getElementById('searchInput'); const clearBtn = document.getElementById('clearSearch'); let searchTimer; searchInput.addEventListener('input', () => { clearTimeout(searchTimer); searchTimer = setTimeout(() => { const q = searchInput.value.trim().toLowerCase(); clearBtn.classList.toggle('visible', q.length > 0); filteredImages = q ? IMAGES.filter(img => img.name.toLowerCase().includes(q)) : [...IMAGES]; currentPage = 1; renderGallery(); }, 200); }); clearBtn.addEventListener('click', () => { searchInput.value = ''; clearBtn.classList.remove('visible'); filteredImages = [...IMAGES]; currentPage = 1; renderGallery(); searchInput.focus(); }); // ── Thumb click ── async function onThumbClick(el, img) { // If already selected, deselect if (selectedImage && selectedImage.src === img.src) { // Clicking the already-selected image deselects it selectedImage = null; el.classList.remove('selected'); document.getElementById('previewImg').classList.remove('visible'); document.getElementById('previewPlaceholder').style.display = ''; document.getElementById('previewMeta').classList.remove('visible'); updateBtn(); return; } // Deselect any currently visible selected thumb on this page // (cross-page deselection is handled by renderGallery which reads selectedImage state) document.querySelectorAll('#galleryGrid .gallery-thumb.selected').forEach(t => t.classList.remove('selected')); el.classList.add('selected'); if (selectedImage && selectedImage.blobURL) URL.revokeObjectURL(selectedImage.blobURL); try { const response = await fetch(img.src); if (!response.ok) throw new Error(`HTTP ${response.status}`); const blob = await response.blob(); const blobURL = URL.createObjectURL(blob); const imgEl = new Image(); imgEl.onload = () => { selectedImage = { name: img.name, src: img.src, imgEl, blobURL }; const pi = document.getElementById('previewImg'); pi.src = blobURL; pi.classList.add('visible'); document.getElementById('previewPlaceholder').style.display = 'none'; const meta = document.getElementById('previewMeta'); meta.classList.add('visible'); document.getElementById('previewName').textContent = img.name; document.getElementById('previewSize').textContent = `${imgEl.naturalWidth} × ${imgEl.naturalHeight}px`; updateBtn(); }; imgEl.src = blobURL; } catch (e) { // Revert the optimistic selected class since load failed el.classList.remove('selected'); alert(`Could not load "${img.name}".\n\nFull-res URL: ${img.src}\nThumb URL: ${img.thumb || img.src}\n\nCheck that the files exist and you're running from a web server (not file://).\n\nDetails: ${e.message}`); } } function updateBtn() { const ready = selectedImage && selectedPresets.size > 0; document.getElementById('generateBtn').disabled = !ready; const hint = document.getElementById('generateHint'); if (!selectedImage && selectedPresets.size === 0) hint.innerHTML = 'Select an image and at least one size to continue'; else if (!selectedImage) hint.innerHTML = 'Now pick an image above'; else if (selectedPresets.size === 0) hint.innerHTML = 'Now choose at least one size'; else hint.innerHTML = `${selectedPresets.size} size${selectedPresets.size > 1 ? 's' : ''} selected — ready to generate`; } // ── Generate ── async function generate() { if (!selectedImage || selectedPresets.size === 0) return; generatedResults = []; const resultsGrid = document.getElementById('resultsGrid'); const resultsArea = document.getElementById('resultsArea'); resultsGrid.innerHTML = ''; resultsArea.style.display = 'none'; const pb = document.getElementById('progressBar'); const pf = document.getElementById('progressFill'); pb.classList.add('active'); pf.style.width = '0%'; const btn = document.getElementById('generateBtn'); btn.disabled = true; btn.textContent = 'Generating…'; const selected = [...selectedPresets]; try { for (let i = 0; i < selected.length; i++) { const p = ALL_PRESETS[selected[i]]; const dataURL = cropCentered(selectedImage.imgEl, p.w, p.h); generatedResults.push({ preset: p, dataURL }); pf.style.width = `${((i + 1) / selected.length) * 100}%`; await new Promise(r => setTimeout(r, 30)); } } catch (e) { pb.classList.remove('active'); btn.disabled = false; btn.textContent = 'Generate Wallpapers'; alert(e.message); return; } pb.classList.remove('active'); document.getElementById('resultsTitle').textContent = `${generatedResults.length} Wallpaper${generatedResults.length !== 1 ? 's' : ''} — ${selectedImage.name}`; resultsArea.style.display = 'block'; generatedResults.forEach((r, i) => { const ar = r.preset.w / r.preset.h; const card = document.createElement('div'); card.className = 'result-card'; card.style.animationDelay = `${i * 0.05}s`; card.innerHTML = `
${r.preset.name}
${r.preset.w} × ${r.preset.h}px
`; resultsGrid.appendChild(card); }); resultsArea.scrollIntoView({ behavior: 'smooth', block: 'start' }); btn.disabled = false; btn.textContent = 'Generate Wallpapers'; showToast(`${generatedResults.length} wallpapers ready`); } function cropCentered(img, targetW, targetH) { const canvas = document.createElement('canvas'); canvas.width = targetW; canvas.height = targetH; const ctx = canvas.getContext('2d'); // Fill background color first (shows through any transparent areas in the PNG) ctx.fillStyle = selectedBgColor; ctx.fillRect(0, 0, targetW, targetH); const tAR = targetW / targetH, sAR = img.width / img.height; let sx, sy, sw, sh; if (sAR > tAR) { sh = img.height; sw = sh * tAR; sx = (img.width - sw) / 2; sy = 0; } else { sw = img.width; sh = sw / tAR; sx = 0; sy = (img.height - sh) / 2; } ctx.drawImage(img, sx, sy, sw, sh, 0, 0, targetW, targetH); try { return canvas.toDataURL('image/png'); } catch (e) { throw new Error('Could not read image data. Make sure this page is served from a web server, not opened as a local file.'); } } function downloadOne(i) { const r = generatedResults[i]; const safeName = selectedImage.name.replace(/\s+/g, '-').toLowerCase(); const a = document.createElement('a'); a.href = r.dataURL; a.download = `${safeName}-${r.preset.w}x${r.preset.h}.png`; a.click(); } async function downloadAll() { for (let i = 0; i < generatedResults.length; i++) { downloadOne(i); await new Promise(r => setTimeout(r, 150)); } showToast('All wallpapers downloaded'); } function showToast(msg) { const t = document.getElementById('toast'); t.textContent = msg; t.classList.add('show'); setTimeout(() => t.classList.remove('show'), 2500); } // ───────────────────────────────────────────────────────────── // BACKGROUND COLOR // ───────────────────────────────────────────────────────────── const SWATCHES = [ { name: 'Yellow', hex: '#ffdd00' }, { name: 'Leaf Green', hex: '#83c341' }, { name: 'Fire Red', hex: '#ef3a2d' }, { name: 'Water Blue', hex: '#3ec4e1' }, { name: 'Orange', hex: '#ee8100'}, { name: 'Pokémon Red', hex: '#e40114'}, { name: 'Charcoal', hex: '#3D3D3D' }, { name: 'White', hex: '#ffffff', light: true }, { name: 'Silver', hex: '#bdbdbd', light: true }, { name: 'Cream', hex: '#fff8e1', light: true }, { name: 'Transparent', hex: 'transparent' }, ]; function setColor(hex, name, skipPickerSync) { selectedBgColor = hex === 'transparent' ? 'transparent' : hex; // Update swatch active states document.querySelectorAll('.swatch').forEach(s => { s.classList.toggle('active', s.dataset.hex === hex); }); // Sync color picker (can't set 'transparent' on input[type=color]) if (!skipPickerSync && hex !== 'transparent') { document.getElementById('colorPicker').value = hex; } // Sync hex input document.getElementById('hexInput').value = hex === 'transparent' ? 'transparent' : hex.toUpperCase(); // Update preview chip const swatch = document.getElementById('colorPreviewSwatch'); const name_el = document.getElementById('colorPreviewName'); if (hex === 'transparent') { swatch.style.background = 'repeating-conic-gradient(#ccc 0% 25%, #fff 0% 50%) 0 0 / 10px 10px'; } else { swatch.style.background = hex; } name_el.textContent = name || hex.toUpperCase(); // Update preview image background const previewWrap = document.getElementById('previewImg').parentElement; previewWrap.style.background = hex === 'transparent' ? 'repeating-conic-gradient(#ccc 0% 25%, #fff 0% 50%) 0 0 / 16px 16px' : hex; } // Build swatch grid const swatchGrid = document.getElementById('swatchGrid'); SWATCHES.forEach(s => { const el = document.createElement('div'); el.className = 'swatch' + (s.light ? ' light-swatch' : ''); el.dataset.hex = s.hex; el.title = s.name; if (s.hex === 'transparent') { el.style.background = 'repeating-conic-gradient(#ccc 0% 25%, #fff 0% 50%) 0 0 / 10px 10px'; el.style.border = '2px solid #ccc'; } else { el.style.background = s.hex; } el.addEventListener('click', () => setColor(s.hex, s.name)); swatchGrid.appendChild(el); }); // Color picker sync const colorPicker = document.getElementById('colorPicker'); const hexInput = document.getElementById('hexInput'); colorPicker.addEventListener('input', () => { setColor(colorPicker.value, '', true); }); hexInput.addEventListener('input', () => { const val = hexInput.value.trim(); if (val.toLowerCase() === 'transparent') { setColor('transparent', 'Transparent', false); return; } const hex = val.startsWith('#') ? val : '#' + val; if (/^#[0-9a-fA-F]{6}$/.test(hex)) { setColor(hex, '', false); } }); hexInput.addEventListener('blur', () => { // Reformat on blur const val = hexInput.value.trim().toLowerCase(); if (val !== 'transparent') { const hex = val.startsWith('#') ? val : '#' + val; if (/^#[0-9a-fA-F]{6}$/.test(hex)) { hexInput.value = hex.toUpperCase(); } else { // Invalid — reset to current hexInput.value = selectedBgColor === 'transparent' ? 'transparent' : selectedBgColor.toUpperCase(); } } }); // Default to white on load setColor('#ffffff', 'White'); // ── Init ── renderGallery();




Desktop



Mobile

What's my device size? (updated 10/23/22)




What size fits my device?

Below is a cheat sheet on what's the best size for your device.

iPhone

  • iPhone 14 Pro Max: 1290x2796
  • iPhone 14 Pro: 1290x2796
  • iPhone 14: 1170x2532
  • iPhone 13 Pro Max: 1284x2778
  • iPhone 13 Pro: 1170x2532
  • iPhone 13 Mini: 1080x2340
  • iPhone 13: 1170x2532
  • iPhone 12 Pro Max: 1284x2778
  • iPhone 12 Pro: 1170x2532
  • iPhone 12: 1170x2532
  • iPhone 12 Mini: 1080x2340
  • iPhone 11 Pro Max: 1242x2688
  • iPhone 11 Pro: 1125x2436
  • iPhone 11: 828×1792
  • iPhone Xs Max: 1242×2688
  • iPhone Xs: 1125x2436
  • iPhone Xr: 828×1792
  • iPhone X: 1125x2436
  • iPhone SE (2020): 750x1334
  • iPhone 8 Plus: 1080x1920
  • iPhone 8: 750x1334
  • iPhone 7 Plus: 1080x1920
  • iPhone 7: 750x1334
  • iPhone 6s plus: 1080x1920
  • iPhone 6s: 750x1334
  • iPhone 6 plus: 1080x1920
  • iPhone 6: 750x1334
  • iPhone SE: 640x1136

Samsung Galaxy

  • Galaxy Z Flip: 1080x2636
  • Galaxy S20 Ultra: 1440x3200
  • Galaxy S20+: 1440x3200
  • Galaxy S20: 1440x3200
  • Galaxy S10e: 1080x2280
  • Galaxy S10+: 1440x3040
  • Galaxy S10: 1440x3040
  • Galaxy Note 10+: 1440x3040
  • Galaxy Note 10 Lite: 1080x2400
  • Galaxy Note 10: 1080x2280
  • Galaxy S9+: 1440x2960
  • Galaxy S9: 1440x2960
  • Galaxy Note 8: 1440x2960
  • Galaxy S8+: 1440x2960
  • Galaxy S8: 1440x2960
  • Samsung Galaxy A8: 1080x1920
  • Galaxy S7: 1440x2560
  • Galaxy S7 Edge: 1440x2560
  • Samsung Galaxy A5: 1080x1920

Other Android Devices

  • LG V60 ThinQ 5G: 1080x2460
  • OnePlus 8 Pro: 1440x3168
  • Google Pixel 4 XL: 1440x3040
  • Google Pixel 4: 1080x2280
  • Google Pixel 3 XL: 1440x2960
  • Google Pixel 3: 1080x2160
  • Google Pixel 2 XL: 1440x2880
  • Google Pixel 2: 1080x1920
  • Google Pixel: 1080x1920
  • OnePlus 5: 1080x1920
  • Google Pixel XL: 1440x2560
  • Moto Z2 Force: 1440x2560
  • HTC U11: 1440x2560

Tablets

  • iPad Pro (4th Gen): 2048x2732
  • iPad Pro (3rd Gen): 1668x2388
  • iPad Air (4th Gen) 1640x2360
  • iPad Air (3rd Gen) 1668x2224
  • iPad Air / 2 1536x2048
  • iPad Mini: 768x1024
  • iPad (8th Gen): 1620x2160

Seth Hay: When Seth is not designing or developing, he spends time with his family and his occasional dose of anime, sports and video games.
Related Post