0
我正在尋找一種方式來填補的圖像與在FabricJs畫布上的圖像模式,因爲沒有內置image filter做到這一點。儘管我的代碼仍然處於早期版本,但基本上它應該可以工作(不幸的是它不會)。 所有的eavy工作都是通過applyTo
方法完成的,在這裏我加載圖像,然後用圖案填充隱藏的畫布。我注意到,有一個函數(source
)落在無限遞歸:我已經準備上JSFiddle演示最大調用堆棧大小的自定義圖像過濾超過
誰能幫助我瞭解如何解決這個問題
var pattern = new fabric.Pattern({
source: function() {
fhc.setDimensions({
width: smile.getWidth() + 5,
height: smile.getHeight() + 5,
});
return fhc.getElement();
},
repeat: 'repeat'
});
?
(function (global) {
'use strict';
var fabric = global.fabric || (global.fabric = {}),
extend = fabric.util.object.extend;
fabric.Image.filters.ImagePatternEffect = fabric.util.createClass(fabric.Image.filters.BaseFilter, {
type: 'ImagePatternEffect',
initialize: function (options) {
options = options || {};
this.img = options.img;
},
applyTo: function (canvasEl) {
var w = canvasEl.width;
var h = canvasEl.height;
var hc = document.createElement('canvas');
fabric.Image.fromURL('http://i.imgur.com/0Ks0mlY.png', function (smile) {
debugger;
hc.setAttribute('width', w);
hc.setAttribute('height', h);
var fhc = new fabric.StaticCanvas(hc);
fhc.add(smile);
var pattern = new fabric.Pattern({
source: function() {
fhc.setDimensions({
width: smile.getWidth() + 5,
height: smile.getHeight() + 5,
});
return fhc.getElement();
},
repeat: 'repeat'
});
var rect = new fabric.Rect({
fill: pattern,
width: w,
height: h
});
fhc.add(rect);
fhc.renderAll();
var ifhcContext = fhc.getContext('2d');
var fhcImageData = ifhcContext.getImageData(0, 0, fhc.width, fhc.height);
var fhcData = fhcImageData.data;
var context = canvasEl.getContext('2d'),
imageData = context.getImageData(0, 0, canvasEl.width, canvasEl.height),
data = imageData.data;
for (var i = 0, n = data.length; i < n; i += 4) {
data[i] += fhcData[i];
data[i + 1] += fhcData[i + 1];
data[i + 2] += fhcData[i + 2];
}
context.putImageData(imageData, 0, 0);
});
},
toObject: function() {
return extend(this.callSuper('toObject'), {
});
}
});
fabric.Image.filters.ImagePatternEffect.fromObject = function (object) {
return new fabric.Image.filters.ImagePatternEffect(object);
};
})(typeof exports !== 'undefined' ? exports : this);
var canvas = new fabric.Canvas('c');
fabric.Image.fromURL('http://i.imgur.com/qaQ8jir.png', function (img) {
var orImg = img;
img.filters.push(new fabric.Image.filters.ImagePatternEffect({
img: orImg,
}));
img.applyFilters(canvas.renderAll.bind(canvas));
canvas.add(img.set({
width: 300,
height: 300,
}));
}, {
crossOrigin: ''
});
坦克您的回覆,hoever如果你看看我的代碼,你可以看到你的片段的相同的代碼。順便說一句,重複:「不重複」做圖案的無圖案;) – InferOn
你好,我相信,我展示它上面的代碼小,見效快,它的工作原理,它是自我解釋。如果它幫助你解決你的問題,只需在我的答案上打勾,然後就可以了。無論誰需要在他的對象上添加圖像模式,他都可以使用我上面顯示的代碼。歡呼 –
您的片斷它已經在我的代碼,這是另一個問題,請閱讀問題,我想呈現了一個長方形的重複模式的位圖,然後應用這種模式在其他圖像有那麼一點點,你理解你的代碼它只是解決方案的一小部分?你可以閱讀我的代碼,看看它已經存在的矩形中的模式負載嗎?乾杯 – InferOn