PixelPlace Image Overlayer

Place images on pixelplace.io

当前为 2024-08-12 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         PixelPlace Image Overlayer
// @namespace    http://tampermonkey.net/
// @version      v3
// @description  Place images on pixelplace.io
// @author       Ghost
// @match        https://pixelplace.io/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    let image = document.createElement('img');
    image.style.position = 'absolute';
    image.style.opacity = '0.5'; // 50% transparent by default
    let imageSize = 100; // Initial image size
    let imageUrl = ''; // URL for image
    let originalImageUrl = ''; // Original URL for image
    let locked = false; // Image lock state
    let lockImageUrl = 'https://i.imgur.com/RmYtAGW.jpg'; // URL for lock image
    let copyrightElement = document.getElementById('copyright');

    // Create buttons for resizing and uploading images
    let uploadButton = createButton('Upload Image', '150px', '10%', '-50%', 'translateY(-50%)');
    let biggerButton = createButton('Bigger', '150px', '25%', '-50%', 'translateY(-50%)');
    let smallerButton = createButton('Smaller', '150px', '40%', '-50%', 'translateY(-50%)');
    let lockButton = createButton('Lock Image', '150px', '55%', '-50%', 'translateY(-50%)');
    // Create opacity slider
    let opacitySlider = createSlider('Opacity', '150px', '70%', '-50%', 'translateY(-50%)');

    // Create menu button
    let menuButton = createButton('Menu', '80px', '5%', '-50%', 'translateY(-50%)');
    menuButton.style.display = ''; // Ensure menu button is visible initially

    // Function to create a button
    function createButton(text, width, top, topTranslation, transform) {
        let button = document.createElement('button');
        button.textContent = text;
        button.style.position = 'fixed';
        button.style.left = '50%';
        button.style.transform = 'translateX(-50%) ' + transform; // Center horizontally
        button.style.width = width;
        button.style.top = top;
        button.style.display = 'none'; // Initially invisible
        // Adding rainbow outline to the buttons
        button.style.outline = '3px solid transparent';
        button.style.outlineOffset = '-3px';
        button.style.animation = 'rainbow 2s infinite';
        document.body.appendChild(button);
        return button;
    }

    // Function to create a slider
    function createSlider(text, width, top, topTranslation, transform) {
        let label = document.createElement('label');
        label.textContent = text;
        label.style.position = 'fixed';
        label.style.left = '50%';
        label.style.transform = 'translateX(-50%) ' + transform; // Center horizontally
        label.style.width = width;
        label.style.top = top;
        label.style.display = 'none'; // Initially invisible

        let slider = document.createElement('input');
        slider.type = 'range';
        slider.min = '0';
        slider.max = '100';
        slider.value = '50'; // Starting at 50% opacity
        slider.style.width = '100%';
        slider.style.position = 'absolute';
        slider.style.left = '0';
        slider.style.top = '20px'; // Position below the label
        slider.style.outline = '1px solid blue'; // Adding outline to the slider
        slider.style.display = 'none'; // Initially invisible

        label.appendChild(slider);
        document.body.appendChild(label);

        return slider;
    }

    // Function to toggle the visibility of other buttons
    function toggleMenu() {
        let buttons = [uploadButton, biggerButton, smallerButton, lockButton, opacitySlider];
        for (let button of buttons) {
            button.style.display = button.style.display === 'none' ? '' : 'none';
        }
        opacitySlider.parentNode.style.display = opacitySlider.parentNode.style.display === 'none' ? '' : 'none';
    }

    // Event listener for menu button
    menuButton.addEventListener('click', toggleMenu);

    // Function to place the image at the clicked position
    function placeImage(event) {
        if (!locked && imageUrl) {
            const x = event.clientX + window.scrollX;
            const y = event.clientY + window.scrollY;
            image.src = imageUrl;
            image.style.left = x + 'px';
            image.style.top = y + 'px';
            image.style.width = imageSize + 'px';
            // Adding rainbow outline to the submitted image
            image.style.outline = '3px solid transparent';
            image.style.outlineOffset = '-3px';
            image.style.boxShadow = '0 0 0 3px white inset'; // Adding white inset outline
            image.style.animation = 'rainbow 2s infinite';
            document.body.appendChild(image);
        }
    }

    // Function to toggle image lock
    function toggleLock() {
        locked = !locked;
        if (!locked) {
            image.src = originalImageUrl; // Restore original image when unlocked
        }
        updateOpacity(); // Update opacity only if the image is not locked
        updateCopyright();
    }

    // Function to update the opacity based on lock state and slider
    function updateOpacity() {
        if (!locked) {
            let opacityValue = opacitySlider.value;
            image.style.opacity = opacityValue / 100; // Convert to 0-1 range for CSS
        }
    }

    // Function to update the text in the copyright element
    function updateCopyright() {
        if (locked) {
            copyrightElement.textContent = 'Image Locked';
            copyrightElement.style.color = 'red';
        } else {
            copyrightElement.textContent = 'Image Not Locked';
            copyrightElement.style.color = 'green';
        }
    }

    // Event listener for mouse click to place the image
    document.addEventListener('click', placeImage);

    // Event listener for resizing the image bigger
    biggerButton.addEventListener('click', function() {
        imageSize += 10;
        image.style.width = imageSize + 'px';
    });

    // Event listener for resizing the image smaller
    smallerButton.addEventListener('click', function() {
        if (imageSize > 10) {
            imageSize -= 10;
            image.style.width = imageSize + 'px';
        }
    });

    // Event listener for uploading an image
    uploadButton.addEventListener('click', function() {
        const fileInput = document.createElement('input');
        fileInput.type = 'file';
        fileInput.accept = 'image/*';
        fileInput.addEventListener('change', function() {
            const file = fileInput.files[0];
            const reader = new FileReader();
            reader.onload = function(e) {
                imageUrl = e.target.result;
                originalImageUrl = imageUrl; // Store original image URL
                if (!locked && imageUrl) {
                    image.src = imageUrl;
                    image.style.width = imageSize + 'px';
                }
            };
            reader.readAsDataURL(file);
        });
        fileInput.click();
    });

    // Event listener for locking/unlocking the image
    lockButton.addEventListener('click', toggleLock);

    // Event listener for the opacity slider
    opacitySlider.addEventListener('input', function() {
        updateOpacity(); // Adjust opacity in real-time
    });

    // Event listener for keyboard controls
    document.addEventListener('keydown', function(event) {
        // Down arrow key: Toggle image lock
        if (event.key === 'ArrowDown') {
            toggleLock();
        }
    });

    // Prevent interactions with elements behind the image
    image.addEventListener('mousedown', function(event) {
        event.stopPropagation();
    });

    // Ensure mouse events pass through the image
    image.style.pointerEvents = 'none';

    // Initialize the copyright text
    updateCopyright();
})();