2016-01-03 68 views
0

我正在使用Fabricjs,我正在使用一些圖像過濾器使用它們的卷積。在圖像上應用矩陣後如何恢復到以前的狀態?

但是,對於超過200KB的圖像大小,它會非常慢。 因此,我決定編寫自己的邏輯來應用濾鏡,然後調用canvas.renderAll()從畫布畫布更新畫布。

我能夠使用的內核 matrix: [ -2, -1, 0, -1, 1, 1, 0, 1, 2 ]

申請壓紋但如何要回圖像的原始狀態,換句話說,我是否需要申請任何其他內核/矩陣?

+0

您不能反轉卷積過濾器。在應用過濾器之前,您需要複製圖像。 – Blindman67

+0

http://jsfiddle.net/f6P3R/,點擊圖片,然後選中/取消選中複選框,它的工作原理?我無法使用它,因爲它會使瀏覽器產生更大的圖像 – subhfyu546754

+0

是織物會複製圖像,數學上,上面顯示的卷積過濾器不能反轉,因爲您無法確定結果的每個組件來自哪個像素。 – Blindman67

回答

1

首先編寫自己的過濾器類:

(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)一些濾波器是不可逆的,如果它們更好地存儲圖像的副本,而不是逐個像素地返回。

+0

我無法理解你的答案。你可以添加一個小提琴來解釋答案。
假設這是修改參考畫布的代碼:'var imageData = ctx.getImageData(0,0,hc.width,hc.height); \t var data = imageData.data;對於(var i = 0; i subhfyu546754

+0

我更好地解釋你可以做什麼。 – AndreaBogazzi

相關問題