我正在使用Fabricjs,我正在使用一些圖像過濾器使用它們的卷積。在圖像上應用矩陣後如何恢復到以前的狀態?
但是,對於超過200KB的圖像大小,它會非常慢。 因此,我決定編寫自己的邏輯來應用濾鏡,然後調用canvas.renderAll()從畫布畫布更新畫布。
我能夠使用的內核 matrix: [ -2, -1, 0, -1, 1, 1, 0, 1, 2 ]
申請壓紋但如何要回圖像的原始狀態,換句話說,我是否需要申請任何其他內核/矩陣?
我正在使用Fabricjs,我正在使用一些圖像過濾器使用它們的卷積。在圖像上應用矩陣後如何恢復到以前的狀態?
但是,對於超過200KB的圖像大小,它會非常慢。 因此,我決定編寫自己的邏輯來應用濾鏡,然後調用canvas.renderAll()從畫布畫布更新畫布。
我能夠使用的內核 matrix: [ -2, -1, 0, -1, 1, 1, 0, 1, 2 ]
申請壓紋但如何要回圖像的原始狀態,換句話說,我是否需要申請任何其他內核/矩陣?
首先編寫自己的過濾器類:
(function(global) {
'use strict';
var fabric = global.fabric || (global.fabric = { }),
extend = fabric.util.object.extend;
fabric.Image.filters.MyFilter = fabric.util.createClass(fabric.Image.filters.BaseFilter, /** @lends fabric.Image.filters.MyFilter.prototype */ {
/**
* Filter type
* @param {String} type
* @default
*/
type: 'MyFilter',
/**
* Constructor
*/
initialize: function(options) {
options = options || { };
},
/**
* Applies filter to canvas element
* @param {Object} canvasEl Canvas element to apply filter to
*/
applyTo: function(canvasEl) {
var context = canvasEl.getContext('2d'),
imageData = context.getImageData(0, 0, canvasEl.width, canvasEl.height),
data = imageData.data,
for (var i = 0, len = data.length; i < len; i += 4) {
data[i] = 255 - data[i];
data[i + 1] = 255 - data[i + 1];
data[i + 2] = 255 - data[i + 2];
}
context.putImageData(imageData, 0, 0);
},
/**
* Returns object representation of an instance
* @return {Object} Object representation of an instance
*/
toObject: function() {
return extend(this.callSuper('toObject'), {
});
}
});
/**
* Returns filter instance from an object representation
* @static
* @param {Object} object Object to create an instance from
* @return {fabric.Image.filters.RemoveWhite} Instance of fabric.Image.filters.MyFilter
*/
fabric.Image.filters.MyFilter.fromObject = function(object) {
return new fabric.Image.filters.MyFilter(object);
};
})(typeof exports !== 'undefined' ? exports : this);
其次,你的正常fabricjs邏輯應用濾鏡:
myimage.filters[0] = new fabric.Image.filters.MyFilter;
myimage.applyFilters(canvas.renderAll.bind(canvas));
當你想回到正常的圖像做:
myimage.filters[0] = null;
myimage.applyFilters(canvas.renderAll.bind(canvas));
一些注意事項:
1)如果你發佈的代碼是你的過濾器,它看起來像一個倒置的顏色過濾器可在:
fabric.Image.filters.Invert()
2)如果你真的想再次反轉公式,你只需要重新運行過濾器如果你想使用自定義函數。
如果a = 255 - a
,再次執行a = 255 - a
將恢復到原始值。 3)一些濾波器是不可逆的,如果它們更好地存儲圖像的副本,而不是逐個像素地返回。
我無法理解你的答案。你可以添加一個小提琴來解釋答案。
假設這是修改參考畫布的代碼:'var imageData = ctx.getImageData(0,0,hc.width,hc.height); \t var data = imageData.data;對於(var i = 0; i
我更好地解釋你可以做什麼。 – AndreaBogazzi
您不能反轉卷積過濾器。在應用過濾器之前,您需要複製圖像。 – Blindman67
http://jsfiddle.net/f6P3R/,點擊圖片,然後選中/取消選中複選框,它的工作原理?我無法使用它,因爲它會使瀏覽器產生更大的圖像 – subhfyu546754
是織物會複製圖像,數學上,上面顯示的卷積過濾器不能反轉,因爲您無法確定結果的每個組件來自哪個像素。 – Blindman67