可以让无影坦克现形
// ==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]
}
})();