// ==UserScript== // @name Lap // @author googleGuard // @version 2.2 // @description 贴吧编辑框生成舔楼主图片 // @description:zh-cn 贴吧编辑框生成舔楼主图片 // @namespace googleGuard // @include http://tieba.baidu.com/f?* // @include http://tieba.baidu.com/p/* // @include http://imgsrc.baidu.com/* // @include http://imgsrc.baidu.com/* // @include http://*photos.baidu.com/* // @include http://*photos.bdimg.com/* // @include http://tb.himg.baidu.com/* // @run-at document-end // @grant none // @downloadURL none // ==/UserScript== lapList = { '六花': { width: 200, height: 210, repeat: 0, //循环次数,0无限循环 delay: 0, //每帧间隔,毫秒 layer: [ [ {src: 'http://imgsrc.baidu.com/forum/pic/item/5882b2b7d0a20cf4c463b28f75094b36adaf99eb.jpg'}, {x: 40, y: 50, w: 60, h: 60, src: '[FACE]'}, ], [ {src: 'http://imgsrc.baidu.com/forum/pic/item/6f061d950a7b0208def170b161d9f2d3572cc8a2.jpg'}, {x: 120, y: 80, w: 60, h: 60, src: '[FACE]'}, ], [ {src: 'http://imgsrc.baidu.com/forum/pic/item/e4dde71190ef76c6a806b77b9e16fdfaae51678d.jpg'}, {x: 95, y: 140, w: 60, h: 60, src: '[FACE]'}, ], [ {src: 'http://imgsrc.baidu.com/forum/pic/item/b58f8c5494eef01f23995495e3fe9925bd317dd4.jpg'}, {x: 15, y: 150, w: 60, h: 60, src: '[FACE]'}, ], [ {src: 'http://imgsrc.baidu.com/forum/pic/item/b8389b504fc2d5628ffa9cbde41190ef77c66ceb.jpg'}, {x: 0, y: 100, w: 60, h: 60, src: '[FACE]'}, ], ] }, 'WHY_R_U_SO_DIAO': { width: 205, height: 148, layer: [ [ {x: 93, y: 32, w: 110, h: 110, src: '[FACE]'}, {src: 'http://imgsrc.baidu.com/forum/pic/item/728da9773912b31b3c5482798518367adab4e1a2.jpg'}, ], ] }, '舔': { width: 186, height: 260, text: '笑舔[FLOOR]楼 @[NAME]
', afterText: '-------------------------', layer: [ [ {src: 'http://imgsrc.baidu.com/forum/pic/item/4ec2d5628535e5ddeba1e98f75c6a7efcf1b62d4.jpg'}, {x: -95, y: 154, r: -Math.PI / 100 * 10.5, w: 110, h: 110, src: '[FACE]'}, ], ] }, }; /** * This class handles LZW encoding * Adapted from Jef Poskanzer's Java port by way of J. M. G. Elliott. * @author Kevin Weiner (original Java version - kweiner@fmsware.com) * @author Thibault Imbert (AS3 version - bytearray.org) * @author Kevin Kwok (JavaScript version - https://github.com/antimatter15/jsgif) * @version 0.1 AS3 implementation */ LZWEncoder=function(){var exports={};var EOF=-1;var imgW;var imgH;var pixAry;var initCodeSize;var remaining;var curPixel;var BITS=12;var HSIZE=5003;var n_bits;var maxbits=BITS;var maxcode;var maxmaxcode=1<=254)flush_char(outs)};var cl_block=function cl_block(outs){cl_hash(hsize);free_ent=ClearCode+2;clear_flg=true;output(ClearCode,outs)};var cl_hash=function cl_hash(hsize){for(var i=0;i=0){disp=hsize_reg-i;if(i===0)disp=1;do{if((i-=disp)<0)i+=hsize_reg;if(htab[i]==fcode){ent=codetab[i];continue outer_loop}}while(htab[i]>=0)}output(ent,outs);ent=c;if(free_ent0){outs.writeByte(a_count);outs.writeBytes(accum,0,a_count);a_count=0}};var MAXCODE=function MAXCODE(n_bits){return(1<0)cur_accum|=(code<=8){char_out((cur_accum&0xff),outs);cur_accum>>=8;cur_bits-=8}if(free_ent>maxcode||clear_flg){if(clear_flg){maxcode=MAXCODE(n_bits=g_init_bits);clear_flg=false}else{++n_bits;if(n_bits==maxbits)maxcode=maxmaxcode;else maxcode=MAXCODE(n_bits)}}if(code==EOFCode){while(cur_bits>0){char_out((cur_accum&0xff),outs);cur_accum>>=8;cur_bits-=8}flush_char(outs)}};LZWEncoder.apply(this,arguments);return exports}; /* * NeuQuant Neural-Net Quantization Algorithm * ------------------------------------------ * * Copyright (c) 1994 Anthony Dekker * * NEUQUANT Neural-Net quantization algorithm by Anthony Dekker, 1994. See * "Kohonen neural networks for optimal colour quantization" in "Network: * Computation in Neural Systems" Vol. 5 (1994) pp 351-367. for a discussion of * the algorithm. * * Any party obtaining a copy of these files from the author, directly or * indirectly, is granted, free of charge, a full and unrestricted irrevocable, * world-wide, paid up, royalty-free, nonexclusive right and license to deal in * this software and documentation files (the "Software"), including without * limitation the rights to use, copy, modify, merge, publish, distribute, * sublicense, and/or sell copies of the Software, and to permit persons who * receive copies from any such party to do so, with the only requirement being * that this copyright notice remain intact. */ /* * This class handles Neural-Net quantization algorithm * @author Kevin Weiner (original Java version - kweiner@fmsware.com) * @author Thibault Imbert (AS3 version - bytearray.org) * @author Kevin Kwok (JavaScript version - https://github.com/antimatter15/jsgif) * @version 0.1 AS3 implementation */ NeuQuant=function(){var exports={};var netsize=256;var prime1=499;var prime2=491;var prime3=487;var prime4=503;var minpicturebytes=(3*prime4);var maxnetpos=(netsize-1);var netbiasshift=4;var ncycles=100;var intbiasshift=16;var intbias=(1<>betashift);var betagamma=(intbias<<(gammashift-betashift));var initrad=(netsize>>3);var radiusbiasshift=6;var radiusbias=(1<>1;for(j=previouscol+1;j>1;for(j=previouscol+1;j<256;j++)netindex[j]=maxnetpos};var learn=function learn(){var i;var j;var b;var g;var r;var radius;var rad;var alpha;var step;var delta;var samplepixels;var p;var pix;var lim;if(lengthcount>radiusbiasshift;if(rad<=1)rad=0;for(i=0;i=lim)pix-=lengthcount;i++;if(delta===0)delta=1;if(i%delta===0){alpha-=alpha/alphadec;radius-=radius/radiusdec;rad=radius>>radiusbiasshift;if(rad<=1)rad=0;for(j=0;j=0)){if(i=bestd)i=netsize;else{i++;if(dist<0)dist=-dist;a=p[0]-b;if(a<0)a=-a;dist+=a;if(dist=0){p=network[j];dist=g-p[1];if(dist>=bestd)j=-1;else{j--;if(dist<0)dist=-dist;a=p[0]-b;if(a<0)a=-a;dist+=a;if(dist>=netbiasshift;network[i][1]>>=netbiasshift;network[i][2]>>=netbiasshift;network[i][3]=i}};var alterneigh=function alterneigh(rad,i,b,g,r){var j;var k;var lo;var hi;var a;var m;var p;lo=i-rad;if(lo<-1)lo=-1;hi=i+rad;if(hi>netsize)hi=netsize;j=i+1;k=i-1;m=1;while((jlo)){a=radpower[m++];if(jlo){p=network[k--];try{p[0]-=(a*(p[0]-b))/alpharadbias;p[1]-=(a*(p[1]-g))/alpharadbias;p[2]-=(a*(p[2]-r))/alpharadbias}catch(e){}}}};var altersingle=function altersingle(alpha,i,b,g,r){var n=network[i];n[0]-=(alpha*(n[0]-b))/initalpha;n[1]-=(alpha*(n[1]-g))/initalpha;n[2]-=(alpha*(n[2]-r))/initalpha};var contest=function contest(b,g,r){var i;var dist;var a;var biasdist;var betafreq;var bestpos;var bestbiaspos;var bestd;var bestbiasd;var n;bestd=~(1<<31);bestbiasd=bestd;bestpos=-1;bestbiaspos=bestpos;for(i=0;i>(intbiasshift-netbiasshift));if(biasdist>betashift);freq[i]-=betafreq;bias[i]+=(betafreq<=0)dispose=code};var setRepeat=exports.setRepeat=function setRepeat(iter){if(iter>=0)repeat=iter};var setTransparent=exports.setTransparent=function setTransparent(c){transparent=c};var setComment=exports.setComment=function setComment(c){comment=c};var addFrame=exports.addFrame=function addFrame(im,is_imageData){if((im===null)||!started||out===null){throw new Error("Please call start method before calling addFrame");}var ok=true;try{if(!is_imageData){image=im.getImageData(0,0,im.canvas.width,im.canvas.height).data;if(!sizeSet)setSize(im.canvas.width,im.canvas.height)}else{image=im}getImagePixels();analyzePixels();if(firstFrame){writeLSD();writePalette();if(repeat>=0){writeNetscapeExt()}}writeGraphicCtrlExt();if(comment!==''){writeCommentExt()}writeImageDesc();if(!firstFrame)writePalette();writePixels();firstFrame=false}catch(e){ok=false}return ok};var finish=exports.finish=function finish(){if(!started)return false;var ok=true;started=false;try{out.writeByte(0x3b)}catch(e){ok=false}return ok};var reset=function reset(){transIndex=0;image=null;pixels=null;indexedPixels=null;colorTab=null;closeStream=false;firstFrame=true};var setFrameRate=exports.setFrameRate=function setFrameRate(fps){if(fps!=0xf)delay=Math.round(100/fps)};var setQuality=exports.setQuality=function setQuality(quality){if(quality<1)quality=1;sample=quality};var setSize=exports.setSize=function setSize(w,h){if(started&&!firstFrame)return;width=w;height=h;if(width<1)width=320;if(height<1)height=240;sizeSet=true};var start=exports.start=function start(){reset();var ok=true;closeStream=false;out=new ByteArray();try{out.writeUTFBytes("GIF89a")}catch(e){ok=false}return started=ok};var cont=exports.cont=function cont(){reset();var ok=true;closeStream=false;out=new ByteArray();return started=ok};var analyzePixels=function analyzePixels(){var len=pixels.length;var nPix=len/3;indexedPixels=[];var nq=new NeuQuant(pixels,len,sample);colorTab=nq.process();var k=0;for(var j=0;j>16;var g=(c&0x00FF00)>>8;var b=(c&0x0000FF);var minpos=0;var dmin=256*256*256;var len=colorTab.length;for(var i=0;i=0){disp=dispose&7}disp<<=2;out.writeByte(0|disp|0|transp);WriteShort(delay);out.writeByte(transIndex);out.writeByte(0)};var writeCommentExt=function writeCommentExt(){out.writeByte(0x21);out.writeByte(0xfe);out.writeByte(comment.length);out.writeUTFBytes(comment);out.writeByte(0)};var writeImageDesc=function writeImageDesc(){out.writeByte(0x2c);WriteShort(0);WriteShort(0);WriteShort(width);WriteShort(height);if(firstFrame){out.writeByte(0)}else{out.writeByte(0x80|0|0|0|palSize)}};var writeLSD=function writeLSD(){WriteShort(width);WriteShort(height);out.writeByte((0x80|0x70|0x00|palSize));out.writeByte(0);out.writeByte(0)};var writeNetscapeExt=function writeNetscapeExt(){out.writeByte(0x21);out.writeByte(0xff);out.writeByte(11);out.writeUTFBytes("NETSCAPE"+"2.0");out.writeByte(3);out.writeByte(1);WriteShort(repeat);out.writeByte(0)};var writePalette=function writePalette(){out.writeBytes(colorTab);var n=(3*256)-colorTab.length;for(var i=0;i>8)&0xFF)};var writePixels=function writePixels(){var myencoder=new LZWEncoder(width,height,indexedPixels,colorDepth);myencoder.encode(out)};var stream=exports.stream=function stream(){return out};var setProperties=exports.setProperties=function setProperties(has_start,is_first){started=has_start;firstFrame=is_first};return exports}; // Lap (function() { var contain = { id: 'LapContain', title: '\u0028\u0E51\u2022\u0300\u3142\u2022\u0301\u0029\u0648\u2727', width: 263, height: 426, left: function() { return (document.documentElement.clientWidth / 2 - this.width / 2).toFixed(1) + 'px' }, top: function() { return (document.documentElement.clientHeight / 2 - this.height / 2).toFixed(1) + 'px' } }; var face = {}; var imageList = {}; var getImage = function(u, c) { var x = createElement('IFRAME', {style:'display:none'}); x.onload = function() { var t = setInterval(function() { if (!imageList[u]) { return }; var i = new Image(); i.onload = function() { c(this) }; i.src = URL.createObjectURL(imageList[u]); x.parentNode.removeChild(x), clearInterval(t) }, 1); }; x.src = u; document.documentElement.appendChild(x) }; var postImage = function(b, c) { var t = new XMLHttpRequest(); t.open('GET', 'http://tieba.baidu.com/dc/common/imgtbs', true); t.onreadystatechange = function() { t.readyState == 4 && (function(tbs) { var f = new FormData(), x = new XMLHttpRequest(); f.append('file', b); x.open('POST', 'http://upload.tieba.baidu.com/upload/pic?tbs=' + tbs, true); x.onreadystatechange = function() { x.readyState == 4 && (function(i) { c(i.pic_water.replace('/tieba/', '/forum/'), i.fullpic_width, i.fullpic_height) })(JSON.parse(x.responseText).info) }; x.withCredentials = true; x.send(f) })(JSON.parse(t.responseText).data.tbs) }; t.send() }; var madeImage = function(l, x, y, m, c) { var t = this, u = arguments, a = 'image/jpeg', b = t.getContext('2d'), k = lapList[l].layer, f = function(i) { y == 0 && (x == 1 && (m = new GIFEncoder(), a = 'image/gif', m.setRepeat(lapList[l].repeat || 0), m.setDelay(lapList[l].delay || 84), m.start(), !1) || x > 0 && m.addFrame(b)); b.save(); k[x][y].r && b.rotate(k[x][y].r); b.drawImage(i, k[x][y].x || 0, k[x][y].y || 0, k[x][y].w || t.width, k[x][y].h || t.height); b.restore(); y = y < k[x].length - 1 ? y + 1 : (++x, 0); x < (!m ? 1 : k.length) ? madeImage.apply(t, u) : (c && c(toBlob((typeof(m) == 'object' ? (m.addFrame(b), m.finish(), m.stream().bin) : Array.prototype.map.call(atob(t.toDataURL(a).replace('data:' + a + ';base64,', '')), function(x) {return x.charCodeAt(0) & 0xff})), a))) } x == 0 && y == 0 && (t.height = lapList[l].height, t.width = lapList[l].width); getImage(k[x][y].src == '[FACE]' ? face.src : k[x][y].src, f) }; var toBlob = function(s, f) { return new Blob([new Uint8Array(s).buffer], {type: f}) }; var createElement = function(e, s) { e = document.createElement(e), s = s || {}; for (var i in s) { e.setAttribute(i, s[i]) }; return e }; var removeContain = function(e) { var d = document.getElementById(contain.id); return d && (e && (e.preventDefault(), e.stopPropagation()) || d.parentNode.removeChild(d), !0) }; var createContain = function(e) { var i, j, t, d, o; removeContain(); d = createElement('DIV', {id: contain.id, class: 'dialogJ dialogJfix dialogJshadow ui-draggable', style: 'z-index:60001;width:' + contain.width + 'px;left:' + contain.left() + ';top:' + contain.top()}); d.innerHTML = '
' + contain.title + ' 
'; document.body.appendChild(d); o = e.target.parentNode, face.src = o.querySelector('.p_author_face>IMG').src + '?t=' + (new Date()).getTime(); o = JSON.parse(o.parentNode.parentNode.parentNode.parentNode.getAttribute('data-field')); face.floor = o.content.post_no, face.name = o.author.user_name; i = document.querySelector('#' + contain.id + ' .dialogJbody'); for (j in lapList) { t = createElement('CANVAS'); i.appendChild(createElement('DIV', {class: 'lapContent', data: j, style: 'cursor:pointer'})).appendChild(t); madeImage.call(t, j, 0, 0, 0) } }; var createButton = function() { var f = document.querySelectorAll('.icon_relative'); for (var i = f.length - 1; i > -1; i--) { var j = f[i].appendChild(createElement('DIV', {class: 'LAP_BUTTON', style: 'position:absolute;right:0;bottom:0;background-color:#eee;padding:0 3px 0 3px;border-radius:2px;box-shadow:0 0 1px #333'})); j.addEventListener('click', createContain, false); j.textContent = '\u8214' } }; if (location.hostname != 'tieba.baidu.com') { var Img = new Image(); Img.onload = function() { var c = document.createElement('canvas'); c.width = this.width, c.height = this.height; c.getContext('2d').drawImage(this, 0, 0); window.parent.postMessage(location.href + '!IMAGE_DATA!' + c.toDataURL(), '*') }; Img.src = location.href; return }; window.addEventListener('message', function(e) { if (e.data.indexOf('!IMAGE_DATA!') == -1) { return }; e = e.data.split('!IMAGE_DATA!'); imageList[e[0]] = toBlob(Array.prototype.map.call(atob(e[1].replace('data:image/png;base64,', '')), function(x) {return x.charCodeAt(0) & 0xff}), 'image/png') }, false); window.addEventListener('resize', function() { var d = document.getElementById(contain.id); d && (d.style.left = contain.left(), d.style.top = contain.top()) }, false); document.addEventListener('click', function(e) { e.target.className.indexOf('dialogJclose') != -1 && removeContain(e); e.target.parentNode.className.indexOf('lapContent') != -1 && removeContain(e) && (function() { var i = e.target.parentNode.getAttribute('data'); window.scrollTo(0, 0xffffff); madeImage.call(createElement('CANVAS'), i, 0, 0, 1, function(b) { postImage(b, function(u, w, h) { var r = function(t) { return t.replace('[FLOOR]', face.floor).replace('[NAME]', face.name) }; document.getElementById('ueditor_replace').innerHTML += (lapList[i].text ? '

' + r(lapList[i].text) + '

' : '') + '

' + (lapList[i].afterText ? '

' + r(lapList[i].afterText) + '

' : '') }) }) })() }, false); (function() { var f = function() { !document.querySelector('.LAP_BUTTON') && createButton() }; (new MutationObserver(f)).observe(document, {childList: true, subtree: true}); f() })() })();