在使用画布工作/学习时间之后我已经设法获得图像克隆和它的像素现在我已经让用户从颜色specterm中选择颜色并且我在我的函数中有颜色十六进制:
move: function (color) {
// 'color' is the value user selected
var img_id = jQuery(".selected_bg_img").attr("id");
alert(img_id);
var x = 0;
var y = 0;
var width = 409;
var height = 409;
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
var img=document.getElementById(img_id);
ctx.drawImage(img,x,y,width,height);
var imageData = ctx.getImageData(0,0,width,height);
var data = imageData.data;
alert(data);
}
现在有两个任务正在进行中,
1.我们如何从数据中提取主色?
2.我们如何将这种主色转换为我们在功能中获得的颜色?对于实时工作示例,我在结尾处给出了链接
注意:从产品图像的左侧选择图像(任何最后3个),当选择颜色时,将图像克隆到画布。
在这里,我尝试使用选择的颜色替换最大颜色来克隆图像。
for (var i=0;i<imgData.data.length;i+=4)
{
imgData.data[i]=255-imgData.data[i];
imgData.data[i+1]=255-imgData.data[i+1];
imgData.data[i+2]=255-imgData.data[i+2];
imgData.data[i+3]=255;
}
*****编辑*****
我的问题不是很复杂,我想我有这个图像在这里输入图像描述
因此我们可以清楚地看到主色是灰色的,通过任何方法,我只是试图用我的功能中的新颜色替换该颜色,并用新颜色绘制该图像。我拍摄的图像显示了另一个例子:
图像左侧的http://www.art.com/products/p14499522-sa-i3061806/pela-silverman-colorful-season-i.htm?sOrig=CAT&sOrigID=0&dimVals=729271&ui=573414C032AA44A693A641C8164EB595当我们选择相似的图像时,它们在图像的底部中心有“更改颜色”选项。这正是我想要做的。
所以现在我尝试读取图像1x1,这是我在登录时得到的内容(特别是我已经显示的图像):
[166, 158, 152, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…]
所以它可能是从左上角开始的第一次开始,我想它需要在整个图像上进行迭代,这是我在迭代整个图像时得到的结果:
[110, 118, 124, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255…]
我用于迭代的循环是:
var imageData = ctx.getImageData(0,0,width,height);
var data = imageData.data;
for (var i=0;i<data.length;i+=4)
{
data[i]=255-data[i];
data[i+1]=255-data[i+1];
data[i+2]=255-data[i+2];
data[i+3]=255;
}
console.log(data);
这次迭代是对的吗?如果是,它似乎正在计算和替换主导颜色,我在这里是空白但我现在有rgb中的用户值,需要寻找应该放置该值的地方
答案 0 :(得分:2)
你走了。当我说你发现的链接是合适的时候,我似乎早些时候提供了错误和误导性的信息。的抱歉!强>
基本上,您需要使用null
合成模式。
这是一个可供您试用的演示。单击第三个图像将选择一种新颜色。
multiply
&#13;
function byId(id){return document.getElementById(id)}
window.addEventListener('load', onDocLoaded, false);
function onDocLoaded(evt)
{
byId('canvas2').addEventListener('click', onCanvasClicked, false);
colorize('green');
}
function onCanvasClicked(evt)
{
var newColour = getRandomColour();
colorize(newColour);
}
function getRandomColour()
{
return '#' + Math.floor(Math.random() * (Math.pow(2,24)-1)).toString(16);
}
function colorize(colourToUse)
{
var mask = byId('maskImg');
var colorImg = byId('colorImg');
var width = colorImg.naturalWidth;
var height = colorImg.naturalHeight;
// draw the mask image to a canvas
var can = byId('canvas1');
var ctx = can.getContext('2d');
can.width = width;
can.height = height;
ctx.drawImage(mask, 0, 0);
// colorize the non transparent areas
ctx.globalCompositeOperation = "source-in";
ctx.fillStyle = colourToUse;
ctx.fillRect(0, 0, can.width, can.height);
// draw the combined output
var can2 = byId('canvas2');
var ctx2 = can2.getContext('2d');
can2.width = width;
can2.height = height;
ctx2.drawImage(colorImg, 0, 0);
ctx2.globalCompositeOperation = 'multiply';
ctx2.drawImage(can,0,0);
}
&#13;
body {
background-color: ivory;
padding: 20px;
}
canvas
{
border: 1px solid red;
width: 275px;
height: 275px;
}
.dontShow
{
display: none;
}
&#13;