OWOP Image To Pixel

Script that inserts the image for pixelart in OWOP

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @name         OWOP Image To Pixel
// @match        *.ourworldofpixels.com/*
// @description  Script that inserts the image for pixelart in OWOP
// @author       Pedro Henrique
// @license      MIT
// @version      3.0
// @namespace https://greasyfork.org/users/831014
// @icon https://www.google.com/s2/favicons?domain=ourworldofpixels.com
// ==/UserScript==
var x = 0;
var y = 0;
var alphar = 255;
var alphag = 255;
var alphab = 255;
var imagesize = 64;

var image = [];
var delay = 50;
var pointpaint = false;
var alphacheck = true;
var replacealphacheck = false;
var running;
function run() {
    var _lastimagepixel = [parseInt(image[image.length-1][0]), parseInt(image[image.length-1][1])];
    running = setInterval(function () {
        var iposX = OWOP.mouse.tileX - x;
        var iposY = OWOP.mouse.tileY - y;
        var currentpos = ((iposX + 1) + (_lastimagepixel[0] * iposY)) + iposY
        if (pointpaint == true) {
            if (currentpos < 0 || currentpos > image.length) {
                currentpos = 0
            }
        }
        else {
            currentpos = 0
        }
        loop:
        for (var i = currentpos; i < image.length; i++) {
            var x1 = x + parseInt(image[i][0]);
            var y1 = y + parseInt(image[i][1]);
            var red = parseInt(image[i][2]);
            var green = parseInt(image[i][3]);
            var blue = parseInt(image[i][4]);
            var alpha = parseInt(image[i][5]);
            if (replacealphacheck == false && alphacheck == true && alpha < 127) {
                red = OWOP.world.getPixel(x1, y1)[0];
                green = OWOP.world.getPixel(x1, y1)[1];
                blue = OWOP.world.getPixel(x1, y1)[2];
            } else if (replacealphacheck == true && alpha < 127) {
                red = alphar;
                green = alphag;
                blue = alphab;
            }
            if (OWOP.world.getPixel(x1, y1) != null && (OWOP.world.getPixel(x1, y1)[0] != red || OWOP.world.getPixel(x1, y1)[1] != green || OWOP.world.getPixel(x1, y1)[2] != blue)) {
                if (x1 < (OWOP.mouse.tileX + 30) && x1 > (OWOP.mouse.tileX - 30) && y1 > (OWOP.mouse.tileY - 30) && y1 < (OWOP.mouse.tileY + 30)) {

                    OWOP.world.setPixel(x1, y1, [red, green, blue], false)
                    break loop;
                }
            }
        }
    }, delay);
}


function initializeComponent() {
    OWOP.windowSys.addWindow(new OWOP.windowSys.class.window("Image to PixelArt", {}, function (win) {
        win.container.style = "height:auto;width:175px;overflow:hidden"

        // Imagem
        win.addObj(document.createTextNode('Choose image'));
        win.addObj(OWOP.util.mkHTML('div', {}));
        var imagem = OWOP.util.mkHTML('img', {
            id: 'imagem',
            width: 32,
            height: 32,
        })
        win.addObj(imagem);
        win.addObj(OWOP.util.mkHTML('div', {}));
        // Tamanho da Imagem
        var imgsizetxt = win.addObj(document.createTextNode('Image Size (0px) : '));
        var imgsizeinput = OWOP.util.mkHTML('input', {
            id: 'imgsizeinput',
            value: 64,
            oninput: function () {
                imgsizetxt.nodeValue = "Image Size (" + this.value + "px) : "
                imagesize = this.value;
            }
        });
        win.addObj(imgsizeinput);
        // Aplicat tamanho
        var applysize_button = OWOP.util.mkHTML('button', {
            id: 'applysize',
            innerHTML: 'Apply Size',
            onclick: function () {
                applysize();
            }
        });
        win.addObj(applysize_button);
        // Escolher imagem
        var escolherimagem = OWOP.util.mkHTML('input', {
            id: 'imageminput',
            type: 'file',
            oninput: function (evt) {
                function readURL(input) {

                    if (input.files && input.files[0]) {
                        var reader = new FileReader();
                        reader.onloadend = async function (e) {
                            var img = new Image();
                            img.src = await e.target.result;
                            document.getElementById("imagem").src = img.src;
                            applysize();
                        }

                        reader.readAsDataURL(input.files[0]);
                    }
                }
                readURL(this)
            }
        });
        win.addObj(escolherimagem);
        // Input da posição da imagem no OWOP
        win.addObj(document.createTextNode('X : '));
        var inputX = OWOP.util.mkHTML('input', {
            id: 'Xinput',
            oninput: function () {
                x = parseInt(this.value);
            }
        });
        win.addObj(OWOP.util.mkHTML('div', {}));
        win.addObj(inputX);
        win.addObj(document.createTextNode('Y : '));
        var inputY = OWOP.util.mkHTML('input', {
            id: 'Yinput',
            oninput: function () {
                y = parseInt(this.value);
            }
        });
        win.addObj(inputY);
        // Delay para aplicar pixel no owop
        var delaytext = win.addObj(document.createTextNode('Delay : '));
        var delayinput = OWOP.util.mkHTML('input', {
            id: 'delayinput',
            type: 'range',
            min: 1, max: 500,
            oninput: function () {
                delaytext.nodeValue = "Delay : " + parseInt(this.value);
                delay = parseInt(this.value);
            }
        });
        win.addObj(delayinput);
        // Modo Point Paint, que pinta o pixel onde você está apontando o mouse
        win.addObj(document.createTextNode('Point Paint'));
        var pointpaintcheck = OWOP.util.mkHTML('input', {
            id: 'pointpaintcheck',
            type: 'checkbox',
            oninput: function () {
                pointpaint = this.checked;
            }
        });
        win.addObj(pointpaintcheck);
        win.addObj(OWOP.util.mkHTML('div', {}));
        // Substituir a cor apha do OWOP
        win.addObj(document.createTextNode('Replace Alpha Color'));
        var alphainput = OWOP.util.mkHTML('input', {
            id: 'replacecheck',
            type: 'checkbox',
            oninput: function () {
                replacealphacheck = this.checked;
            }
        });
        win.addObj(alphainput);
        // Tipo de cor
        var coloriralpha = OWOP.util.mkHTML('input', {
            type: 'color',
            id: 'replacealphacolor',
            onchange: function () {
                alphar = hexToRgb(this.value).r;
                alphag = hexToRgb(this.value).g;
                alphab = hexToRgb(this.value).b;
            }
        });
        win.addObj(coloriralpha);
        win.addObj(OWOP.util.mkHTML('div', {}));
        // Opção de ignorar o Alpha da imagem
        win.addObj(document.createTextNode('Ignore Alpha (.png)'));
        var alphainput = OWOP.util.mkHTML('input', {
            id: 'alphacheck',
            type: 'checkbox',
            checked: 'true',
            oninput: function () {
                alphacheck = this.checked;
            }
        });
        win.addObj(alphainput);
        win.addObj(OWOP.util.mkHTML('div', {}));
        // Botão de Ativar
        var button = OWOP.util.mkHTML('button', {
            id: 'EnableImageToPixel',
            innerHTML: 'Activate',
            onclick: function () {
                if (document.getElementById("Xinput").value != "") {
                    if (document.getElementById("Yinput").value != "") {
                        run();
                        document.getElementById("EnableImageToPixel").disabled = 'true';
                    }
                }
            }
        });
        win.addObj(button);
        // Botão de desativar
        var desativar = OWOP.util.mkHTML('button', {
            id: 'DisableImageToPixel',
            innerHTML: 'Disable',
            onclick: function () {
                clearInterval(running);
                document.getElementById("EnableImageToPixel").removeAttribute("disabled");

            }
        });
        win.addObj(desativar);

        // Evento para definir a posição da imagem no OWOP
        document.addEventListener('keydown', (event) => {
            const keyName = event.key;
            if (keyName == "e" || keyName == "E") {
                document.getElementById("Xinput").value = OWOP.mouse.tileX
                document.getElementById("Yinput").value = OWOP.mouse.tileY
                x = OWOP.mouse.tileX
                y = OWOP.mouse.tileY
            }
        });
    }).move(window.innerWidth - 500, 32));
}

function applysize() {
    var img = new Image();
    img.src = document.getElementById("imagem").src


    var canvas = document.createElement('canvas');
    var imgW = 0;
    var imgH = 0;
    if (imagesize == 0) {
        imgW = img.width;
        imgH = img.height;
    }
    else {
        if (imagesize.toString().includes(";")) {
            let wh = imagesize.toString().split(";");
            imgW = parseInt(wh[0]);
            imgH = parseInt(wh[1]);
        }
        else {
            imgW = imagesize;
            imgH = imagesize;
        }
    }
    canvas.width = imgW;
    canvas.height = imgH;

    var context = canvas.getContext('2d');
    context.drawImage(img, 0, 0, imgW, imgH);
    //context.drawImage(img, 0, 0, img.width, img.height);

    image = [];
    for (var v = 0; v < imgH; v++) {
        for (var i = 0; i < imgW; i++) {
            var pixelData = context.getImageData(i, v, 1, 1).data;
            image.push([i,v,pixelData[0],pixelData[1],pixelData[2],pixelData[3]])
        }
    }
}
function hexToRgb(hex) {
    var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
    return result ? {
        r: parseInt(result[1], 16),
        g: parseInt(result[2], 16),
        b: parseInt(result[3], 16)
    } : null;
}
if (typeof OWOP != 'undefined') initializeComponent();
window.addEventListener('load', function () {
    setTimeout(initializeComponent, 2000);

    // Função que auto reconecta o OWOP
    setInterval(() => {
        if (document.getElementById("load-options").class == "hide") {
            document.getElementById("reconnect-btn").click();
        }
    }, 1000);
});