How To Display A Smoother Gradient In Html5 Canvas?
Solution 1:
Use a s-slope based gradient which could be defined using an ease-in-out function. This way the transition between flat and linear is smoothed out. You may need to compensate a little on the width as initial and final values are closer to the flat values than in the linear approach.
Example
var ctx = document.querySelector("canvas").getContext("2d"), img = newImage();
img.onload = function() {
// init canvas and image
ctx.canvas.width = this.naturalWidth;
ctx.canvas.height = this.naturalHeight;
ctx.drawImage(this, 0, 0);
// gradient using ease-in-outvar comp = 100;
var grd = ctx.createLinearGradient(550 - comp, 0, 700 + comp, 0);
for(var t = 0; t <= 1; t += 0.02) { // convert linear t to "easing" t:
grd.addColorStop(t, "hsla(360, 100%, 100%, " + easeInOut(t) * 0.8 + ")");
}
ctx.fillStyle = grd;
ctx.fillRect(0,0, ctx.canvas.width, ctx.canvas.height * 0.5);
// linear (as before)var grd = ctx.createLinearGradient(550, 0, 700, 0);
grd.addColorStop(0, "hsla(360, 100%, 100%, 0)");
grd.addColorStop(1, "hsla(360, 100%, 100%, 0.8)");
ctx.fillStyle = grd;
ctx.fillRect(0,ctx.canvas.height * 0.5+1, ctx.canvas.width, ctx.canvas.height * 0.5);
};
functioneaseInOut(t) {return t<.5 ? 4*t*t*t : (t-1)*(2*t-2)*(2*t-2)+1}
img.src = "//i.imgur.com/ESyzwQg.png";
canvas {width:100%; height:auto}
<canvas></canvas>
Solution 2:
If by "smoother" you mean transition more gradually, then you need to adjust your color stops. You don't need to adjust the width of the gradient to do that.
grd.addColorStop(0.3,"hsla(360, 100%, 100%, 0)");
grd.addColorStop(1,"hsla(360, 100%, 100%, 0.8)");
Right now, those stops are driven by this, so you're moving from the left at 0 alpha to 30%, which is where you jump to .8 in your alpha channel, if you want this to feel more gradual, then (depending on the effect you want) you should adjust those stops.
grd.addColorStop(0.0,"hsla(360, 100%, 100%, 0)");
grd.addColorStop(1,"hsla(360, 100%, 100%, 0.8)");
That would be more fluid, and you could reduce the alpha as desired. Again, it really depends on the effect you're seeking on the gradient overlay.
Post a Comment for "How To Display A Smoother Gradient In Html5 Canvas?"