Faltningsfilter

Flash Player 9 och senare, Adobe AIR 1.0 och senare

Klassen ConvolutionFilter kan användas för att tillämpa en mängd bildomformningar på BitmapData-objekt eller visningsobjekt, till exempel oskärpa, kantidentifiering, skärpa, relief och avfasning.

Faltningsfiltret går igenom varje pixel i källbilden en i taget och avgör dess slutgiltiga färg genom att använda värdet för pixeln och de omgivande pixlarna. En matris, som specificeras som en array med numeriska värden, anger i vilken utsträckning värdet för varje närliggande pixel påverkar det slutgiltiga värdet.

Ta till exempel den vanligaste matristypen, d.v.s. en 3 x 3-matris. Matrisen innehåller nio värden:

N    N    N 
N    P    N 
N    N    N

När faltningsfiltret används på en viss pixel läser filtret pixelns eget färgvärde (”P” i exemplet) och även värdena för de omgivande pixlarna (”N” i exemplet). Genom att ställa in värdena i matrisen anger du dock hur hög prioritet vissa pixlar har när det gäller att påverka bilden.

I följande matris, som tillämpas med ett faltningsfilter, lämnas bilden oförändrad:

0    0    0 
0    1    0 
0    0    0

Orsaken till att bilden är oförändrad är att den ursprungliga pixelns värde har den relativa styrkan 1 när det gäller att avgöra den slutgiltiga pixelns färg, medan de omgivande pixlarnas värden har den relativa styrkan 0. Det innebär att deras färger inte påverkar den slutgiltiga bilden.

På samma sätt gör den här matrisen att pixlarna i en bild flyttas en pixel till vänster:

0    0    0 
0    0    1 
0    0    0

Observera, att i det här fallet har pixeln i sig ingen effekt på det slutgiltiga värdet för pixeln som visas på den platsen i bilden. Bara värdet för pixeln till höger används för att avgöra pixelns resultatvärde.

I ActionScript skapar du matrisen som en kombination av en Array-instans som innehåller värdena och två egenskaper som anger antalet rader och kolumner i matrisen. I följande exempel läses en bild in och när bilden är klar tillämpas ett faltningsfilter på bilden med matrisen i föregående exempel:

// Load an image onto the Stage. 
var loader:Loader = new Loader(); 
var url:URLRequest = new URLRequest("http://www.helpexamples.com/flash/images/image1.jpg"); 
loader.load(url); 
this.addChild(loader); 
 
function applyFilter(event:MouseEvent):void 
{ 
    // Create the convolution matrix. 
    var matrix:Array = [0, 0, 0, 
                                     0, 0, 1, 
                                     0, 0, 0]; 
     
    var convolution:ConvolutionFilter = new ConvolutionFilter(); 
    convolution.matrixX = 3; 
    convolution.matrixY = 3; 
    convolution.matrix = matrix; 
    convolution.divisor = 1; 
     
    loader.filters = [convolution]; 
} 
 
loader.addEventListener(MouseEvent.CLICK, applyFilter);

Det som inte visas i den här koden är effekten av att använda andra värden än 1 och 0 i matrisen. Samma matris med talet 8 i stället för 1 i högra positionen utför samma åtgärd (pixlarna flyttas till vänster). Dessutom påverkas bildens färger så att de blir åtta gånger intensivare. Det beror på att pixlarnas slutgiltiga färgvärden beräknas genom att matrisvärdena multipliceras med de ursprungliga pixelfärgerna. Värdena läggs ihop och divideras med värdet för filtrets divisor -egenskap. Observera att divisor -egenskapen är 1 i exempelkoden. I allmänhet bör du låta divisor-värdet vara lika med summan av matrisvärdena om du vill att färgernas intensitet ska vara ungefär densamma som i originalbilden. Om matrisens värden sammanlagt är 8 och divisor-egenskapen är 1 blir resultatbilden ungefär åtta gånger så intensiv som originalbilden.

Trots att matrisens effekt inte är särskilt märkbar kan andra matrisvärden användas för att skapa olika effekter. Här finns flera standarduppsättningar med matrisvärden för olika effekter med en 3 x 3-matris:

  • Enkel oskärpa (divisor 5):

         0 1 0 
         1 1 1 
         0 1 0
  • Skärpa (divisor 1):

         0, -1, 0 
        -1, 5, -1 
         0, -1, 0
  • Kantidentifiering (divisor 1):

         0, -1, 0 
        -1, 4, -1 
         0, -1, 0
  • Reliefeffekt (divisor 1):

        -2, -1, 0 
        -1, 1, 1 
         0, 1, 2

    Observera att divisor-egenskapen är 1 för de flesta av dessa effekter. Detta beror på att de negativa matrisvärdena plus de positiva matrisvärdena ger resultatet 1 (eller 0 i fallet kantidentifiering, men divisor -egenskapens värde kan inte vara 0).