Greasy Fork

Greasy Fork is available in English.

AI Image Assistant: Pinterest/ArtStation/IG Matrix

Matrix Edition: One-Click Originals, Smart AI 2x Sharpen, and Source Finder for Pinterest, ArtStation, and Instagram.

当前为 2025-12-30 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         AI Image Assistant: Pinterest/ArtStation/IG Matrix
// @namespace    http://tampermonkey.net/
// @version      5.8
// @description  Matrix Edition: One-Click Originals, Smart AI 2x Sharpen, and Source Finder for Pinterest, ArtStation, and Instagram.
// @author       Pi Xiao
// @match        https://*.pinterest.com/*
// @match        https://*.artstation.com/*
// @match        https://*.instagram.com/*
// @grant        GM_openInTab
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    const BRIDGE_PAGE = "https://meishubiji.cn/ai-processing-center/";

    // --- 1. 多平台原图解析算法 ---
    function getOriginalUrl(img) {
        let url = img.src;
        if (!url) return "";
        const host = location.host;

        if (host.includes('pinterest.com')) {
            return url.replace(/\/(236x|474x|564x|736x|1200x)\//, '/originals/').replace(/\.webp$/, '.jpg');
        } 
        if (host.includes('artstation.com')) {
            return url.replace(/\/(large|medium|small|2k|4k)\//, '/original/');
        }
        if (host.includes('instagram.com')) {
            if (img.srcset) {
                const sets = img.srcset.split(',').map(s => s.trim().split(' '));
                return sets[sets.length - 1][0];
            }
        }
        return url;
    }

    // --- 2. 核心算法引擎:像素级图像重构 ---
    function smartProcess(canvas, ctx, img) {
        const w = canvas.width;
        const h = canvas.height;
        ctx.imageSmoothingQuality = 'high';
        ctx.drawImage(img, 0, 0, w, h);

        let imageData = ctx.getImageData(0, 0, w, h);
        let data = imageData.data;
        const amount = 0.5; 
        for (let i = 0; i < data.length; i += 4) {
            data[i] = Math.min(255, data[i] + (data[i] - 128) * amount);     
            data[i+1] = Math.min(255, data[i+1] + (data[i+1] - 128) * amount); 
            data[i+2] = Math.min(255, data[i+2] + (data[i+2] - 128) * amount); 
        }
        ctx.putImageData(imageData, 0, 0);

        ctx.globalCompositeOperation = 'overlay';
        ctx.globalAlpha = 0.2;
        ctx.drawImage(canvas, 0, 0);
        ctx.globalAlpha = 1.0;
        ctx.globalCompositeOperation = 'source-over';
    }

    // --- 3. 2x 智能增强弹窗 ---
    async function processAndShow(imgElement) {
        const originalUrl = getOriginalUrl(imgElement);
        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 = '<div style="text-align:center;"><div class="px-spinner"></div><div style="margin-top:15px; font-size:14px; color:#00ffcc;">AI PIXEL RECONSTRUCTION...</div></div><style>.px-spinner { width:35px; height:35px; border:3px solid rgba(0,255,204,0.1); border-top-color:#00ffcc; border-radius:50%; animation:spin 0.8s linear infinite; margin:0 auto; } @keyframes spin { to { transform:rotate(360deg); } }</style>';
        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;
            smartProcess(canvas, ctx, img);

            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;";
            bar.innerHTML = `<p style="color:#00ffcc; font-weight:bold; font-size:13px; margin-bottom:15px;">✓ SMART 2X ENHANCEMENT COMPLETE</p>`;

            const btnAi = document.createElement('button');
            btnAi.innerHTML = '🚀 LAUNCH AI 8K ENGINE';
            btnAi.style = "background:linear-gradient(45deg, #6a11cb 0%, #2575fc 100%); color:white; border:none; padding:12px 35px; border-radius:50px; font-size:15px; font-weight:bold; cursor:pointer; box-shadow:0 10px 25px rgba(37,117,252,0.4); transition:0.3s;";
            btnAi.onclick = () => window.open(`${BRIDGE_PAGE}?url=${encodeURIComponent(originalUrl)}`, '_blank');

            bar.appendChild(btnAi);
            container.appendChild(scrollBox);
            container.appendChild(bar);
            overlay.appendChild(container);
        };
        img.onerror = () => { window.open(originalUrl, '_blank'); overlay.remove(); };
    }

    // --- 4. 注入逻辑:适配多站容器 ---
    function injectButtons() {
        const images = document.querySelectorAll('img');
        images.forEach(img => {
            const src = img.src;
            if (!src || img.width < 100 || img.closest('.px-helper-bar')) return;
            
            const host = location.host;
            const container = img.closest('[data-test-id="pin-visual-wrapper"]') || 
                              img.closest('.artwork-image-container') ||
                              img.closest('._aagv') || 
                              img.closest('.XiG') || 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 btnEnhance = document.createElement('button');
                btnEnhance.innerHTML = '🪄 2x HD';
                btnEnhance.style = btnStyle + 'background: #00BFFF;';
                btnEnhance.onclick = (e) => { e.preventDefault(); e.stopPropagation(); processAndShow(img); };

                const btnOrig = document.createElement('button');
                btnOrig.innerHTML = '🖼️ Originals';
                btnOrig.style = btnStyle + 'background: #E60023;';
                btnOrig.onclick = (e) => { e.preventDefault(); e.stopPropagation(); window.open(getOriginalUrl(img), '_blank'); };

                const btnSource = document.createElement('button');
                btnSource.innerHTML = '🔍 Source';
                btnSource.style = btnStyle + 'background: #34a853;';
                btnSource.onclick = (e) => { 
                    e.preventDefault(); e.stopPropagation(); 
                    window.open(`https://lens.google.com/uploadbyurl?url=${encodeURIComponent(getOriginalUrl(img))}`, '_blank');
                };

                bar.appendChild(btnEnhance);
                bar.appendChild(btnOrig);
                bar.appendChild(btnSource);
                container.appendChild(bar);
            }
        });
    }

    setInterval(injectButtons, 2500);
    const observer = new MutationObserver(injectButtons);
    observer.observe(document.body, { childList: true, subtree: true });
})();