HTML5 Canvas更改图像颜色

来吧

我正在使用jquery滑块通过着色将图像颜色从蓝色更改为红色(范围为-100到100)。这意味着,当滑块值为0时,图像应看起来正常(默认为一),并根据滑块的值从蓝色(-100)变为(100)。

在本地,我能够将图像加载到画布中(由于某种原因图像未加载到jsfiddle上)。

主要问题是当前代码未按预期修改颜色。

http://jsfiddle.net/q3qw1c0o/3/

   $(function(){

    var currentValue = $('#currentValue');


   $( "#slider" ).slider({
        range: "max",
        min: -100,
        max: 100,
        value: 0,
        slide: function( event, ui ) {
            $( "#sliderValue" ).val( ui.value );
            $(ui.value).val($('#sliderValue').val());
            changeIt(ui.value);
        }
        });

    $("#sliderValue").change(function() {
    $("#slider").slider("value" , $(this).val())
    });

});

 var x; //drawing context
var width;
var height;
var fg;
var buffer

window.onload = function() {
    var drawingCanvas = document.getElementById('myDrawing');
    // Check the element is in the DOM and the browser supports canvas
    if(drawingCanvas && drawingCanvas.getContext) {
        // Initaliase a 2-dimensional drawing context
        x = drawingCanvas.getContext('2d');
        width = x.canvas.width;
        height = x.canvas.height;

        fg = new Image();
        fg.src = 'http://icons.iconarchive.com/icons/iconshow/transport/256/Sportscar-car-icon.png';

        // to tint the image, draw it first
        x.drawImage(fg,0,0);

    }
}

    function changeIt(value) {


        // create offscreen buffer, 
        buffer = document.createElement('canvas');
        buffer.width = fg.width;
        buffer.height = fg.height;
        bx = buffer.getContext('2d');

        // fill offscreen buffer with the tint color
        bx.fillStyle = 'rgb(' + value + ', 0, ' + (255 - value) + ')';
        bx.fillRect(0,0,buffer.width,buffer.height);

        // destination atop makes a result with an alpha channel identical to fg, but with all pixels retaining their original color *as far as I can tell*
        bx.globalCompositeOperation = "destination-atop";
        bx.drawImage(fg,0,0);

                //then set the global alpha to the amound that you want to tint it, and draw the buffer directly on top of it.
        x.globalAlpha = 0.5;
        x.drawImage(buffer,0,0);

    }

请看一看。

品牌

这是一种getImageData用于操纵每个图像像素的色调的方法:

  • 使用getImageData获取的每个像素的RGBA颜色数据

  • 将RGBA颜色转换为HSL颜色。HSL中的H表示色相,这是我们通常认为的“颜色”。

  • 如果原始像素的色相为红色(色相<30或色相> 300),则将色相偏移范围控件中指定的量。如果要从红色变为蓝色,则滑块应将颜色(色调)从0变为-.33。

注意:getImageData要求图片与网页起源于同一域,否则您将收到跨域安全性错误。

这是示例代码和演示:

var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var cw=canvas.width;
var ch=canvas.height;

var imgData,data,originalData;

$myslider=$('#myslider');
$myslider.attr({min:0,max:33}).val(0);
$myslider.on('input change',function(){
  var value=parseInt($(this).val());
  HueShift(30,300,-value/100);
});

var img=new Image();
img.crossOrigin='anonymous';
img.onload=start;
img.src="http://icons.iconarchive.com/icons/iconshow/transport/256/Sportscar-car-icon.png";
function start(){
  cw=canvas.width=img.width;
  ch=canvas.height=img.height;
  ctx.drawImage(img,0,0);

  imgData=ctx.getImageData(0,0,cw,ch);
  data=imgData.data;
  imgData1=ctx.getImageData(0,0,cw,ch);
  originalData=imgData1.data;

}



function HueShift(hue1,hue2,shift){

  for(var i=0;i<data.length;i+=4){
    red=originalData[i+0];
    green=originalData[i+1];
    blue=originalData[i+2];
    alpha=originalData[i+3];

    // skip transparent/semiTransparent pixels
    if(alpha<230){continue;}

    var hsl=rgbToHsl(red,green,blue);
    var hue=hsl.h*360;

    // change redish pixels to the new color
    if(hue<30 || hue>300){


      var newRgb=hslToRgb(hsl.h+shift,hsl.s,hsl.l);
      data[i+0]=newRgb.r;
      data[i+1]=newRgb.g;
      data[i+2]=newRgb.b;
      data[i+3]=255;
    }
  }    
  ctx.putImageData(imgData,0,0);
}






////////////////////////
// Helper functions
//

function rgbToHsl(r, g, b){
  r /= 255, g /= 255, b /= 255;
  var max = Math.max(r, g, b), min = Math.min(r, g, b);
  var h, s, l = (max + min) / 2;
  if(max == min){
    h = s = 0; // achromatic
  }else{
    var d = max - min;
    s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
    switch(max){
      case r: h = (g - b) / d + (g < b ? 6 : 0); break;
      case g: h = (b - r) / d + 2; break;
      case b: h = (r - g) / d + 4; break;
    }
    h /= 6;
  }
  return({ h:h, s:s, l:l });
}

function hslToRgb(h, s, l){
  var r, g, b;
  if(s == 0){
    r = g = b = l; // achromatic
  }else{
    function hue2rgb(p, q, t){
      if(t < 0) t += 1;
      if(t > 1) t -= 1;
      if(t < 1/6) return p + (q - p) * 6 * t;
      if(t < 1/2) return q;
      if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;
      return p;
    }
    var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
    var p = 2 * l - q;
    r = hue2rgb(p, q, h + 1/3);
    g = hue2rgb(p, q, h);
    b = hue2rgb(p, q, h - 1/3);
  }
  return({
    r:Math.round(r * 255),
    g:Math.round(g * 255),
    b:Math.round(b * 255),
  });
}
body{ background-color: ivory; }
#canvas{border:1px solid red;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<h4>Change the slider to change the car color</h4>
<input id=myslider type=range min=0 max=100 value=0><br>
<canvas id="canvas" width=300 height=300></canvas>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

HTML5 Canvas:更改图像颜色

来自分类Dev

HTML5 Canvas:更改图像颜色

来自分类Dev

我想在html5-canvas中更改图像内图像的颜色

来自分类Dev

更改图像 Javascript/HTML 部分的颜色

来自分类Dev

问:HTML5 Canvas 更改背景颜色

来自分类Dev

HTML5 Canvas遮罩特定颜色

来自分类Dev

更改onclick HTML5的背景颜色

来自分类Dev

在html5中更改背景颜色

来自分类Dev

HTML5画布更改图像Z索引

来自分类Dev

HTML5 canvas javascript

来自分类Dev

HTML5 canvas javascript

来自分类Dev

实时预览HTML5 Canvas背景和颜色

来自分类Dev

在html5中将图像颜色更改为灰度

来自分类Dev

当标签更改HTML时更改图像

来自分类Dev

更改图像颜色

来自分类Dev

HTML5如何在Canvas中调用图像

来自分类Dev

html5 canvas; 旋转的图像在即闪烁

来自分类Dev

HTML5 Canvas:向不断绘制的图像添加碰撞

来自分类Dev

如何在html5 canvas中使用gif图像?

来自分类Dev

从URL加载图像并绘制到HTML5 Canvas

来自分类Dev

从文件将图像添加到HTML5 Canvas

来自分类Dev

HTML5 Canvas:向不断绘制的图像添加碰撞

来自分类Dev

HTML5 Canvas中的图像单击事件

来自分类Dev

HTML5如何在Canvas中调用图像

来自分类Dev

html5 canvas; 旋转的图像在即闪烁

来自分类Dev

从文件将图像添加到HTML5 Canvas

来自分类Dev

HTML5 Canvas 从浏览器缓存加载图像

来自分类Dev

HTML5 canvas如何更改putImageData比例

来自分类Dev

更改HTML5 canvas中的字体的问题