Greasy Fork is available in English.

坦克现形

可以让无影坦克现形

// ==UserScript==
// @name         坦克现形
// @namespace    blog.site.xiaobu
// @version      0.5
// @description  可以让无影坦克现形
// @author       xiaobu
// @match        *://*/*
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    document.body.onmouseover = function (e) {
        if (e.target.tagName === 'IMG') {
            show(e.target);
        }
    }

    /**
     * 将无影坦克现形
     * @param select dom元素
     * */
    function show(select) {
        let canvas = document.createElement("canvas");
        let src = select.src;
        // 百度贴吧图片做特殊处理,压缩图片直接怼到原图
        if (select.src.match("tiebapic.baidu.com")) {
            let basePath = '';
            if (select.src.match("https://")) {
                basePath = 'https://tiebapic.baidu.com/forum/pic/item';
            } else {
                basePath = 'http://tiebapic.baidu.com/forum/pic/item';
            }
            let index = select.src.lastIndexOf("/");
            let imgPath = select.src.substring(index);
            src = basePath + imgPath;
        }
        let con = canvas.getContext("2d");
        let img = new Image();
        img.crossOrigin = 'Anonymous';
        img.src = src;
        img.onload = () => {
            canvas.width = img.width;
            canvas.height = img.height;
            con.drawImage(img, 0, 0);


            let imgData = con.getImageData(0, 0, img.width, img.height);
            // new Promise((resolve) => {
            //     resolve();
            // }).then(() => {

            if (imgData.data[0] % 8 !== 0 || imgData.data[1] % 8 !== 3 || imgData.data[2] % 8 === 0 || imgData.data[2] % 8 > 5) {
                throw "error";
            }

            let list = de(imgData.data[2] % 8, imgData);
            let file = new File([list[1].buffer], '', {type: list[0][2]})
            let path = URL.createObjectURL(file);
            select.href = path;
            select.src = path;
            select.style.display = "block";
            // });
        }
    }

    function de(mode, imgdata) {
        let aa = Math.ceil(3 * mode / 8);
        let n = imgdata.width * imgdata.height;
        let j = 0;
        let k = "";
        let i = 1;
        let mlist = [1, 2, 4, 8, 16, 32, 64, 128];
        let word = "";
        let blist//=new Uint8Array();
        let blength = 0;
        while (i < n && (word.length == 0 || word.slice(-1).charCodeAt(0) > 0)) {
            k = k + (imgdata.data[4 * i] + 256).toString(2).slice(-mode);
            k = k + (imgdata.data[4 * i + 1] + 256).toString(2).slice(-mode);
            k = k + (imgdata.data[4 * i + 2] + 256).toString(2).slice(-mode);
            i++
            for (let ii = 0; ii < aa; ii++) {
                if (k.length >= 8 && (word.length == 0 || word.slice(-1).charCodeAt(0) > 0)) {
                    word = word + String.fromCharCode(parseInt(k.slice(0, 8), 2));
                    k = k.slice(8);
                }
            }
        }
//word分隔符:","
        blength = parseInt(word.split(String.fromCharCode(1))[0]);
        if (!(blength > -1)) {
            throw "error"
        }
        if (!(word.split(String.fromCharCode(1)).length > 2)) {
            throw "error"
        }
        blist = new Uint8Array(blength);
        if (k.length >= 8 && j < blength) {
            blist[j] = parseInt(k.slice(0, 8), 2);
            k = k.slice(8);
            j++
        }
        while (i < n && j < blength) {
            k = k + (imgdata.data[4 * i] + 256).toString(2).slice(-mode);
            k = k + (imgdata.data[4 * i + 1] + 256).toString(2).slice(-mode);
            k = k + (imgdata.data[4 * i + 2] + 256).toString(2).slice(-mode);
            i++
            for (let ii = 0; ii < aa; ii++) {
                if (k.length >= 8 && j < blength) {
                    blist[j] = parseInt(k.slice(0, 8), 2);
                    k = k.slice(8);
                    j++
                }
            }
        }
        return [word.split(String.fromCharCode(0))[0].split(String.fromCharCode(1)), blist]
    }

})();