Your choice
Your choice

Reputation: 455

HTML5 canvas paint blending color tool

Hello i need create blending color tool, i try take color pixel from canvas with getImageData and mixed with my selected color and get average color, i can get it with easy:

/* r1 = red channel from getImageData
   g1 = green channel from getImageData
   b1 = blue channel from getImageData

   r2 = red channel my selected color
   g2,b2 same
*/   
var avR = Math.round(0.5*r1 + 0.5*r2);
var avG = Math.round(0.5*g1 + 0.5*g2);
var avB = Math.round(0.5*b1 + 0.5*b2);

While i drawing i try mixed this colors, but blending effect not available..

Maybe somebody can help me? http://jsfiddle.net/b72ky2sc/6/

i need that tool can get image in left side: enter image description here

Upvotes: 2

Views: 3149

Answers (2)

Infinity8378
Infinity8378

Reputation: 1

I have been able to use hsl and RGB to generate blending rects which can be shrunk or sprited from 768by1536 raw pixel at 50fps this could be sprited as in image or shrunk&moved&alphacomposited to hit targets with draw image or changing the grid. Also this is an example of how the example of low alpha channel blending with rects in HTML5 combined with additive blending may help get a simular to the one you want because each rect can use different alpha blending.

Q% = xw = x/x

ANS = Q% * (v + Geo)

NOTES

Three parts:

  • 2A2SL = (Additive Blueness - 2bitBezierglobalalphaEXIST & CompositeEXIST)
  • A-C, A-J, 0, A+C, A+J add Q = C+J
  • K12+C, K12+J, C+J, K12+C+Q, K12+J+Q K = K12+Q
  • I = A+C J = A+J if K1 = K2 K12+(c, none), Q, [K12]+(Q+C, Q+J)

A B Can add Q and move pattern NWSE

  • w1 J Q+L12/2 -K1+L12/2=
  • w2 Q+J Q+L12/2 K1offset+L12/2=
  • w3 Q Q+L12/2 L12/2
  • w4 Q+C Q+L12/2 L1Offset-L12/2=
  • w5 C Q+L12/2 -L12/2=

How it displays on my chromebook: How it displays on my chromebook


Live example:

<!DOCTYPE html>
<html>
<body>
<CANVAS WIDTH="1920" HEIGHT="1536" ID="canvas" tabindex="0">
        </CANVAS><script>
var canvas = document.getElementById('canvas');
var canvasWidth = canvas.width;
var canvasHeight = canvas.height;
var ctx = canvas.getContext('2d');
var gg=['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f']
                var m = 3,A = 945,E = 0.004,C = 0.005,sJ=3,sK=945,sL=0.005,sM=0.004
ctx.globalAlpha =.375
var dataArray = []
var dataArrayB = []
var L=488,m=0,K=196;
for (i = 0; i < 2688; i += 6) {  
                //mosty 456
                    a = '#';
                    a += gg[4]
                    a += gg[i ^ (i & 4080) ^ i >> 8]
                    a += gg[6]
                    b = '#';
                    b += gg[4]
                    b += gg[5]
                    b += gg[i ^ (i & 4080) ^ i >> 8]
                    var C = E / C * E;
                    var SparcityDDD = (A & 255) + 256
                    A += m;
                    var SparcityD = ((A) & 511) + 948
                    C = E;
                    var WeberD = 0.005*Math.random()
                    E = C / E * C
                    var WeberDDD = 0.005*Math.random()
                    //xw=normal is dot perpendicular*rotational coeffiecient usually small soft body motion=vgeo*xw%+(xvw)
                    Vorticity=24*(i&63)
                    VorticityZ=i>>1
                    VorticityX = (SparcityDDD--);
                    VorticityX *= (2 * (i % 48));
                    VorticityX++;
                    VorticityX *= 6 / WeberDDD;
                    VorticityY = (SparcityD--);
                    VorticityY *= (8 * Math.floor(i / 144));
                    VorticityY++;
                    VorticityY *= 6 / WeberD;
                    que=((Vorticity) & 511)*1.406
                    mue=(Vorticity/2-150)
                    if(que+10>K&&que+10<L){ctx.fillRect((0 * VorticityX + 1.16*VorticityZ)+60 & 2047, (0 * VorticityY + (Vorticity) & 511)*1.406+10,120,15);}
                    ctx.fillStyle = a
                    if(que-13>K&&que-13<L){ctx.fillRect((0 * VorticityX + 1.16*VorticityZ)+60 & 2047, (0 * VorticityY + (Vorticity) & 511)*1.406-13,120,20);}
                    //(50% fade) 80% 2.5,3,2.5,2,3,3,2,2
                    if(mue>K&&mue<L){
                    ctx.fillStyle = ctx.fillStyle = 'hsl(' + i*0.87 + ', 50%, 68%)';//hit majority
                    ctx.fillRect(VorticityZ*1.1+84,Vorticity/2-150, 8, 150);
                    ctx.fillStyle = ctx.fillStyle = 'hsl(' + i*0.87 + ', 50%, 68%)';//hit majority
                    ctx.fillRect(VorticityZ*1.1+104,Vorticity/2-150, 6, 150);
                    }
                    ctx.fillStyle = b
                     if(que-7>K&&que-7<L){ctx.fillRect((0 * VorticityX + 1.16*VorticityZ) & 2047, (0 * VorticityY + (Vorticity) & 511)*1.406-7,120,24);}
                if((que+10>K&&que+10<L)||(que-13>K&&que-13<L)||(mue>K&&mue<L)||(que-7>K&&que-7<L)){
                if (i>1344){
                dataArray.push(i,(mue>K&&mue<(m*i+L))*1,(mue>K&&mue<(m*i+L))*1,(que+10>K&&que+10<(m*i+L))*1,(que-13>K&&que-13<(m*i+L))*1,(que-7>K&&que-7<(m*i+L))*1)
                }else{
                dataArrayB.push(i,(mue>K&&mue<(m*i+L))*1,(mue>K&&mue<(m*i+L))*1,(que+10>K&&que+10<(m*i+L))*1,(que-13>K&&que-13<(m*i+L))*1,(que-7>K&&que-7<(m*i+L))*1)
                }
                }
                }
                alert(dataArrayB);
                alert(dataArray);
</script>
</body>
</html>

Upvotes: 0

user1693593
user1693593

Reputation:

You don't state enough details, but here is how you can use blending modes with canvas. Note that IE do not support any of these yet (except from normal) so test this in recent Firefox or Chrome.

All blending modes in the current revised canvas standard is listed in the drop-down you can use to select mode. This way you can see which mode suits your need most (try things like hard-light with a low alpha value as a start...).

(yeah, I got bored.. :) )

var cont = document.getElementById("spots"),      // UI elements
    canvas = document.getElementById("canvas"),
    alpha = document.getElementById("alpha"),
    modes = document.getElementById("modes"),
    ctx = canvas.getContext("2d"),
    isDown = false,                               // defaults
    color = "rgb(107, 122, 174)";

// set up color palette using a custom "Spot" object
// This will use a callback function when it is clicked, to
// change current color
function Spot(color, cont, callback) {
  var div = document.createElement("div");
  div.style.cssText = "width:50px;height:50px;border:1px solid #000;margin:0 1px 1px 0;background:" + color;
  div.onclick = function() {callback(color)};
  cont.appendChild(div);    
}

// add some spot colors to our palette container
new Spot(color, cont, setColor);
new Spot("rgb(107, 174, 170)", cont, setColor);
new Spot("#00f", cont, setColor);
new Spot("#ff0", cont, setColor);
new Spot("#0ff", cont, setColor);
new Spot("#f0f", cont, setColor);

// this will set current fill style based on spot clicked
function setColor(c) {ctx.fillStyle = c}

// setup defaults
ctx.fillStyle = color;
ctx.globalAlpha = 0.5;

// events
canvas.onmousedown = function() {isDown = true};
window.onmouseup = function() {isDown = false};
window.onmousemove = function(e) {
  if (!isDown) return;
  var r = canvas.getBoundingClientRect(),
      x = e.clientX - r.left,
      y = e.clientY - r.top;
  
  ctx.beginPath();
  ctx.arc(x, y, 25, 0, 2*Math.PI);
  ctx.fill();
};

alpha.onchange = function(){ctx.globalAlpha = alpha.value * 0.01};
modes.onchange = function(){ctx.globalCompositeOperation = modes.value};
body{font:14px sans-serif;background:#333;color:#eee}
#spots {float:right}
#canvas {background:#fff;cursor:crosshair;border:1px solid #777}
<label for="modes">Blending Modes:</label>
<select id="modes">
  <option value="normal">normal</option>
  <option value="multiply">multiply</option>
  <option value="screen">screen</option>
  <option value="overlay">overlay</option>
  <option value="darken">darken</option>
  <option value="lighten">lighten</option>
  <option value="color-dodge">color-dodge</option>
  <option value="color-burn">color-burn</option>
  <option value="hard-light">hard-light</option>
  <option value="soft-light">soft-light</option>
  <option value="difference">difference</option>
  <option value="exclusion">exclusion</option>
  <option value="hue">hue</option>
  <option value="saturation">saturation</option>
  <option value="color">color</option>
  <option value="luminosity">luminosity</option>
</select>
<label for="alpha">Alpha:</label><input id="alpha" type="range" min=0 max=100 value="50">
<br>
<canvas id="canvas" width=500 height=500></canvas><div id="spots"></div>

Upvotes: 9

Related Questions