Difference between revisions of "User:Lerc/Blur"
From CodeStuff
(Created page with "<edcode> </edcode>") |
|||
| (3 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
<edcode> | <edcode> | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | var imageSize = 256; | ||
| + | |||
| + | var bufferWidth=imageSize+2; | ||
| + | var bufferHeight=bufferWidth; | ||
| + | var bufferSize=bufferWidth*bufferHeight*4; | ||
| + | |||
| + | var a = new Uint8Array(bufferSize); | ||
| + | var b = new Uint8Array(bufferSize); | ||
| + | |||
| + | function drawSomething(bytes) { | ||
| + | var r=Math.sin(50/20)+2; | ||
| + | var i=0; | ||
| + | for (var ty=0;ty<bufferHeight;ty++) { | ||
| + | for (var tx=0;tx<bufferWidth;tx++) { | ||
| + | bytes[i++]=(tx*0.75)&0xff; | ||
| + | bytes[i++]=(ty)&0xff; | ||
| + | bytes[i++]=((ty+tx)*-0.457)&0xff; | ||
| + | bytes[i++]=0;//((Math.sqrt((128-tx)*(128-tx)+(128-ty)*(128-ty))*r) &0x3ff); | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | |||
| + | var testBlob=[]; | ||
| + | testBlob.push( {x:70, y:120, r:1.0, g:0.6, b:0.2, w:1} ); | ||
| + | testBlob.push( {x:200, y:20, r:0.0, g:0.6, b:0.0, w:6} ); | ||
| + | testBlob.push( {x:100, y:100, r:1.0, g:0.6, b:0.2, w:1} ); | ||
| + | |||
| + | function randr(range) { | ||
| + | return Math.random()*range-(range/2); | ||
| + | } | ||
| + | |||
| + | for (var i=0; i<15;i++) { | ||
| + | testBlob.push( {x:randInt(255), y:randInt(255), r:Math.random(), g:Math.random(), b:Math.random(), w:Math.random()*4 }) ; | ||
| + | } | ||
| + | |||
| + | function evaluateBlobs(bytes,blobs) { | ||
| + | var i=0; | ||
| + | for (var ty=0;ty<bufferHeight;ty++) { | ||
| + | for (var tx=0;tx<bufferWidth;tx++) { | ||
| + | var r=0,g=0,b=0; | ||
| + | var sum=0; | ||
| + | for (var j=0; j<blobs.length; j++) { | ||
| + | var blob=blobs[j]; | ||
| + | var dx = tx-blob.x; | ||
| + | var dy = ty-blob.y; | ||
| + | |||
| + | var base=1/Math.sqrt(dx*dx + dy*dy); | ||
| + | var force=Math.pow(base,blob.w); | ||
| + | |||
| + | r+=force*blob.r; | ||
| + | g+=force*blob.g; | ||
| + | b+=force*blob.b; | ||
| + | sum+=force; | ||
| + | } | ||
| + | r/=sum; | ||
| + | g/=sum; | ||
| + | b/=sum; | ||
| + | |||
| + | if (r>1) r=1; | ||
| + | if (g>1) g=1; | ||
| + | if (b>1) b=1; | ||
| + | if (r<0) r=0; | ||
| + | if (g<0) g=0; | ||
| + | if (b<0) b=0; | ||
| + | |||
| + | bytes[i++]=r * 255; | ||
| + | bytes[i++]=g * 255; | ||
| + | bytes[i++]=b * 255; | ||
| + | bytes[i++]=255; | ||
| + | |||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | function plot(target,x,y,r,g,b) { | ||
| + | var i =(y*bufferWidth+x)*4; | ||
| + | target[i++]=r; | ||
| + | target[i++]=g; | ||
| + | target[i++]=b; | ||
| + | target[i++]=255; | ||
| + | } | ||
| + | |||
| + | function mix(source,dest) { | ||
| + | function readPixel(x,y) { | ||
| + | if ( (x<0) || (y<0) || (x>=bufferWidth) || (y>=bufferHeight) ) return {r:0,g:0,b:0,a:0.0} | ||
| + | |||
| + | var i =(y*bufferWidth+x)*4; | ||
| + | var result = {r:source[i++],g:source[i++],b:source[i++],a:source[i++]/255.0}; | ||
| + | return result; | ||
| + | } | ||
| + | |||
| + | for (var ty=0;ty<bufferHeight;ty++) { | ||
| + | for (var tx=0;tx<bufferWidth;tx++) { | ||
| + | var up = readPixel(tx,ty-1); | ||
| + | var down = readPixel(tx,ty+1); | ||
| + | var left = readPixel(tx-1,ty); | ||
| + | var right = readPixel(tx+1,ty); | ||
| + | var here = readPixel(tx,ty); | ||
| + | var alphasum = up.a+down.a+left.a+right.a+here.a; | ||
| + | |||
| + | var red = (up.r*up.a + down.r*down.a +left.r*left.a + right.r*right.a + here.r*here.a)/alphasum; | ||
| + | var green = (up.g*up.a + down.g*down.a +left.g*left.a + right.g*right.a + here.g*here.a)/alphasum; | ||
| + | var blue = (up.b*up.a + down.b*down.a +left.b*left.a + right.b*right.a + here.b*here.a)/alphasum; | ||
| + | var i =(ty*bufferWidth+tx)*4; | ||
| + | |||
| + | dest[i++]=red+0.5; | ||
| + | dest[i++]=green+0.5; | ||
| + | dest[i++]=blue+0.5; | ||
| + | dest[i++]=(alphasum==0)?0:255;; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | } | ||
| + | |||
| + | function drawSeeds(target,seeds) { | ||
| + | for (var i=0; i<seeds.length ;i++) { | ||
| + | var seed = seeds[i]; | ||
| + | plot(target,seed.x,seed.y,seed.r,seed.g,seed.b); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | function randInt(max) { | ||
| + | return Math.floor((Math.random()*(max+1))); | ||
| + | } | ||
| + | |||
| + | drawSomething(a); | ||
| + | drawImageData(0,0,bufferWidth,bufferHeight,a); | ||
| + | print("wibble"); | ||
| + | |||
| + | evaluateBlobs(a,testBlob); | ||
| + | drawImageData(0,0,bufferWidth,bufferHeight,a); | ||
| + | print("gleep"); | ||
| + | |||
| + | |||
| + | /* | ||
| + | var seeds = []; | ||
| + | |||
| + | seeds.push( {x:200, y:200, r:100, g:200, b:130} ) | ||
| + | for (var i=0; i<150;i++) { | ||
| + | seeds.push( {x:randInt(255), y:randInt(255), r:randInt(255), g:randInt(255), b:randInt(255)} ) ; | ||
| + | } | ||
| + | |||
| + | for (var j=0; j<5000; j++) { | ||
| + | for (var i=0; i<3; i++) { | ||
| + | |||
| + | drawSeeds(a,seeds); | ||
| + | ///plot(a,200,200,100,200,130); | ||
| + | mix(a,b); | ||
| + | |||
| + | drawSeeds(b,seeds); | ||
| + | mix(b,a); | ||
| + | } | ||
| + | drawImageData(0,0,bufferWidth,bufferHeight,b); | ||
| + | } | ||
| + | */ | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
</edcode> | </edcode> | ||