繁体   English   中英

HTML5 Canvas更改图像颜色

[英]HTML5 Canvas changing image color

我正在使用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> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM