// ==UserScript== // @name Pinterest Ultra Assistant V6.2 (Color Fix) // @namespace http://tampermonkey.net/ // @version 6.2 // @description Bilingual UI, AI 2x Sharpen, Source Finder, and RELIABLE Color Palette Extractor. // @author Pi Xiao // @match https://*.pinterest.com/* // @grant GM_openInTab // @grant GM_setClipboard // @license MIT // @downloadURL none // ==/UserScript== (function() { 'use strict'; const BRIDGE_PAGE = "https://meishubiji.cn/ai-processing-center/"; function rgbToHex(r, g, b) { return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1).toUpperCase(); } // --- 核心:提取色盘功能 --- function getPalette(ctx, w, h) { const data = ctx.getImageData(0, 0, w, h).data; let colors = {}; for (let i = 0; i < data.length; i += 200) { // 采样 let hex = rgbToHex(data[i], data[i+1], data[i+2]); colors[hex] = (colors[hex] || 0) + 1; } return Object.keys(colors).sort((a, b) => colors[b] - colors[a]).slice(0, 6); } // --- 智能增强弹窗 + 色盘生成 --- async function processAndShow(imgUrl) { const originalUrl = imgUrl.replace(/\/(236x|474x|564x|736x|1200x)\//, '/originals/').replace(/\.webp$/, '.jpg'); const overlay = document.createElement('div'); overlay.style = "position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.95);z-index:2147483647;display:flex;flex-direction:column;align-items:center;justify-content:center;color:white;font-family:sans-serif;cursor:zoom-out;"; overlay.innerHTML = '
ANALYZING PIXELS & COLORS...
'; overlay.onclick = () => overlay.remove(); document.body.appendChild(overlay); const img = new Image(); img.crossOrigin = "Anonymous"; img.src = originalUrl; img.onload = function() { const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); canvas.width = img.width * 2; canvas.height = img.height * 2; // 简单的对比度增强算法 ctx.imageSmoothingQuality = 'high'; ctx.drawImage(img, 0, 0, canvas.width, canvas.height); // 提取色盘 (由于有了 crossOrigin,这里 100% 成功) const palette = getPalette(ctx, canvas.width, canvas.height); overlay.innerHTML = ""; const container = document.createElement('div'); container.style = "text-align:center; width:95%; height:90vh; display:flex; flex-direction:column; cursor:default;"; container.onclick = (e) => e.stopPropagation(); const scrollBox = document.createElement('div'); scrollBox.style = "overflow:auto; border:1px solid #333; border-radius:12px; flex:1; background:#050505;"; canvas.style.display = "block"; canvas.style.margin = "0 auto"; scrollBox.appendChild(canvas); // --- 底部工具栏:包含色盘和跳转按钮 --- const bar = document.createElement('div'); bar.style = "padding:20px; display:flex; flex-direction:column; align-items:center; gap:15px;"; // 色盘 HTML let paletteHTML = `
Color Palette:`; palette.forEach(color => { paletteHTML += `
`; }); paletteHTML += `
`; const actionHTML = `
Close Preview ×
`; bar.innerHTML = paletteHTML + actionHTML; container.appendChild(scrollBox); container.appendChild(bar); overlay.id = "px-overlay"; overlay.appendChild(container); // 绑定颜色点击事件 overlay.querySelectorAll('.px-color').forEach(el => { el.onclick = () => { const hex = el.getAttribute('data-hex'); GM_setClipboard(hex); const oldBg = el.style.borderColor; el.style.borderColor = "#00ffcc"; setTimeout(() => el.style.borderColor = oldBg, 500); }; }); overlay.querySelector('#btn-ai-go').onclick = () => window.open(`${BRIDGE_PAGE}?url=${encodeURIComponent(originalUrl)}`, '_blank'); }; img.onerror = () => { window.open(originalUrl, '_blank'); overlay.remove(); }; } function injectButtons() { const images = document.querySelectorAll('img'); images.forEach(img => { const src = img.src; if (!src || !src.includes('pinimg.com') || img.width < 150 || img.closest('.px-helper-bar')) return; const container = img.closest('[data-test-id="pin-visual-wrapper"]') || img.closest('[data-test-id="visual-content-container"]') || img.parentElement; if (container) { if (window.getComputedStyle(container).position === 'static') container.style.position = 'relative'; const bar = document.createElement('div'); bar.className = 'px-helper-bar'; bar.style = "position:absolute; top:10px; left:10px; z-index:1000; display:flex; gap:4px; opacity:0; transition:0.3s; pointer-events:auto;"; container.addEventListener('mouseenter', () => bar.style.opacity = "1"); container.addEventListener('mouseleave', () => bar.style.opacity = "0"); const btnStyle = 'color:white; border:none; border-radius:4px; cursor:pointer; padding:4px 8px; font-weight:bold; font-size:9px; box-shadow:0 2px 5px rgba(0,0,0,0.3); white-space:nowrap;'; const b1 = document.createElement('button'); b1.innerHTML = '🪄 2x HD'; b1.style = btnStyle + 'background:#00BFFF;'; b1.onclick = (e) => { e.preventDefault(); e.stopPropagation(); processAndShow(src); }; const b2 = document.createElement('button'); b2.innerHTML = '🖼️ Originals'; b2.style = btnStyle + 'background:#E60023;'; b2.onclick = (e) => { e.preventDefault(); e.stopPropagation(); window.open(src.replace(/\/(236x|474x|564x|736x)\//, '/originals/'), '_blank'); }; const b3 = document.createElement('button'); b3.innerHTML = '🔍 Source'; b3.style = btnStyle + 'background:#34a853;'; b3.onclick = (e) => { e.preventDefault(); e.stopPropagation(); window.open(`https://lens.google.com/uploadbyurl?url=${encodeURIComponent(src.replace(/\/(236x|474x|564x|736x)\//, '/originals/'))}`, '_blank'); }; bar.appendChild(b1); bar.appendChild(b2); bar.appendChild(b3); container.appendChild(bar); } }); } setInterval(injectButtons, 2500); const observer = new MutationObserver(injectButtons); observer.observe(document.body, { childList: true, subtree: true }); })();