我曾经遇到过同样的问题,无论是JPEG图像还是带有透明背景的PNG图像。
我发现Tint类在这方面没有正常工作,所以我稍微改变了它。您可以在Google Groups上找到相关帖子:
https://groups.google.com/forum/#!msg/fabricjs/DPN0WuRtc-o/ZGgIQK5F9xAJ
这是我的解决方法类(通过使用完整的十六进制值来工作,但您可以轻松地根据自己的需求进行调整):
fabric.Image.filters.Tint = fabric.util.createClass({
type: 'Tint',
initialize: function(HexColor) {
this.color = HexColor;
},
applyTo: function(canvasEl) {
var context = canvasEl.getContext('2d'),
imageData = context.getImageData(0, 0, canvasEl.width, canvasEl.height),
data = imageData.data;
var rUser = ((this.color).toString ()).substr(0,2);
var gUser = ((this.color).toString ()).substr(2,2);
var bUser = ((this.color).toString ()).substr(4,2);
for (var i = 0, len = data.length; i < len; i += 4) {
r = data[i];
g = data[i + 1];
b = data[i + 2];
data[i] = parseInt ((r * parseInt (rUser, 16))/255);
data[i + 1] = parseInt ((g * parseInt (gUser, 16))/255);
data[i + 2] = parseInt ((b * parseInt (bUser, 16))/255);
}
context.putImageData(imageData, 0, 0);
},
toJSON: function() {
return {
type: this.type,
color: this.color
};
}
})`
我用它的方式如下:
//$oCanvas is my fabric Canvas object
//data.color could be 'ff0000' but not 'f00' not anything else like fabric.Color
$img.filters[0] = new fabric.Image.filters.Tint(data.color)
$img.applyFilters($oCanvas.renderAll.bind($oCanvas))
希望对某些人有所帮助。
L.
编辑
在Tint Filter类中进行了一些更改(Github:
https://github.com/kangax/fabric.js/pull/862)。
我再次测试,但仍没有运气,所以我稍微再次更改了它。您可以在Google Groups上找到源代码+说明(
https://groups.google.com/forum/#!topic/fabricjs/DPN0WuRtc-o)
第二次编辑
好的,Kienz制作了一个JSFiddle(
http://jsfiddle.net/Kienz/4wGzk/),其中使用了Tint Filter类和bugfix,并使其正常工作。我建议按照他的方式实施它。