【发布时间】:2017-11-08 02:21:22
【问题描述】:
我有一个 CSS 样式,在它的背景中有一个图像,例如它就像这段代码
.test {
background-image: url("paper.gif");
background-color: #cccccc;
}
我也有一个 javascript 代码,用于获取图像的平均颜色,
function getAverageRGB(imgEl) {
var blockSize = 5, // only visit every 5 pixels
defaultRGB = {r:0,g:0,b:0}, // for non-supporting envs
canvas = document.createElement('canvas'),
context = canvas.getContext && canvas.getContext('2d'),
data, width, height,
i = -4,
length,
rgb = {r:0,g:0,b:0},
count = 0;
if (!context) {
return defaultRGB;
}
height = canvas.height = imgEl.naturalHeight || imgEl.offsetHeight || imgEl.height;
width = canvas.width = imgEl.naturalWidth || imgEl.offsetWidth || imgEl.width;
context.drawImage(imgEl, 0, 0);
try {
data = context.getImageData(0, 0, width, height);
} catch(e) {
/* security error, img on diff domain */alert('x');
return defaultRGB;
}
length = data.data.length;
while ( (i += blockSize * 4) < length ) {
++count;
rgb.r += data.data[i];
rgb.g += data.data[i+1];
rgb.b += data.data[i+2];
}
// ~~ used to floor values
rgb.r = ~~(rgb.r/count);
rgb.g = ~~(rgb.g/count);
rgb.b = ~~(rgb.b/count);
return rgb;
}
正如上面的代码所示,我必须将一个图像元素传递给函数,但实际上我没有任何标签,我只有一个 div,它的 css 有一个背景图像,我怎样才能读取图像数据? 谢谢
【问题讨论】:
-
我可以假设
paper.gif具有透明度吗? -
@yes 如果它更容易,它也可以是 png 或 jpg
-
研究如何动态地从元素中读取样式(getComputedStyle),然后在获得图像 URL 后,在 JavaScript 中创建一个新的
Image对象,将 URL 分配为src,然后在图像load处理程序中从那里开始工作... -
你不能在应用
context.drawImage(imgEl, 0, 0);之前用背景颜色(在本例中为#cccccc)填充画布吗? -
"但是这种方法会下载两次图像吗?" - 不,这就是缓存的用途...
标签: javascript html css