Hem E-böcker Specialeffekter och spelutveckling i Java Appleten BlurImage

Specialeffekter och spelutveckling i Java(TM) - Appleten BlurImage

import java.applet.*;
import java.awt.*;
import java.awt.image.*;

public class blurimage extends Applet {

//"blueimage" kommer att hålla reda på
//bilden som vi skapar.
Image image=null;

public void init()
{
    //Ladda in bilden (filnamnet finns i
    //parametern "image").
    MediaTracker tracker=new MediaTracker(this);
    image=getImage(getDocumentBase(),getParameter("image"));
    tracker.addImage(image,0);
    try {tracker.waitForAll();}
    catch(InterruptedException e){}

    //Nu anropar vi metoden blurImage()
    //för att göra bilden suddig.
    image=blurImage(image);
}

public Image blurImage(Image img)
{
    //Skapa en array för att lagra bildens pixlar och
    //hämta dem.
    Dimension d=new Dimension(img.getWidth(this),img.getHeight(this));
    int pixels[]=new int[d.width*d.height];
    PixelGrabber grabber
        =new PixelGrabber(img,0,0,d.width,d.height,pixels,0,d.width);
    try {grabber.grabPixels();} catch(InterruptedException e){};

    //Variabeln "div" används för att dividera
    //summan av alla komponenterna.
    int div;

    //Det är bäst att vi först skapar tre
    //arrayer för att lagra färgkomponenterna
    //så att bildbehandlingen snabbas upp.
    //Storleken på dessa arrayer måste vara
    //samma som antalet pixlar i bilden.
    int lr[]=new int[d.width*d.height];
    int lg[]=new int[d.width*d.height];
    int lb[]=new int[d.width*d.height];

    //Vi använder en enkel FOR-slinga för att
    //gå lagra varje komponent.
    for (int index=0; index < d.width*d.height; index++)
    {
        //Vi struntar i alfa kanalen så den
        //här metoden kommer bara att fungera
        //med transparenta bilder.
        lr[index]=(pixels[index]&0xff0000)>>16;
        lg[index]=(pixels[index]&0xff00)>>8;
        lb[index]=pixels[index]&0xff;
    }

    //Vi använder två FOR-slingor för bildbehandlingen
    //den här gången.
    int r,g,b;
    for (int x=0; x < d.width; x++)
    {
        for (int y=0; y < d.height; y++)
        {
            //Börja med att sätta d=1 och
            //sätta r,g,b till pixeln
            //(x,y)
            r=lr[x+y*d.width];
            g=lg[x+y*d.width];
            b=lb[x+y*d.width];
            div=1;
            if (x>0)
            {
                //Lägg till pixeln till vänster
                //om pixeln i mitten.
                r+=lr[(x-1)+y*d.width];
                g+=lg[(x-1)+y*d.width];
                b+=lb[(x-1)+y*d.width];
                div++;
                if (y>0)
                {
                    //Lägg till pixeln ovanför
                    //och längst upp till vänster
                    //om pixeln i centrum.
                    r+=lr[x+(y-1)*d.width];
                    g+=lg[x+(y-1)*d.width];
                    b+=lb[x+(y-1)*d.width];
                    r+=lr[(x-1)+(y-1)*d.width];
                    g+=lg[(x-1)+(y-1)*d.width];
                    b+=lb[(x-1)+(y-1)*d.width];
                    div+=2;
                }
                if (y < d.height-1)
                {
                    //Lägg till pixeln nedanför
                    //och längst ner till vänster
                    //om pixeln i centrum.
                    r+=lr[x+(y+1)*d.width];
                    g+=lg[x+(y+1)*d.width];
                    b+=lb[x+(y+1)*d.width];
                    r+=lr[(x-1)+(y+1)*d.width];
                    g+=lg[(x-1)+(y+1)*d.width];
                    b+=lb[(x-1)+(y+1)*d.width];
                    div+=2;
                }
            }
            if (x < d.width-1)
            {
                //Lägg till pixeln till höger
                //om pixeln i mitten.
                r+=lr[(x+1)+y*d.width];
                g+=lg[(x+1)+y*d.width];
                b+=lb[(x+1)+y*d.width];
                div++;
                if (y > 0)
                {
                    //Lägg till pixeln längst
                    //upp till höger
                    //om pixeln i centrum.
                    r+=lr[(x+1)+(y-1)*d.width];
                    g+=lg[(x+1)+(y-1)*d.width];
                    b+=lb[(x+1)+(y-1)*d.width];
                    div++;
                }
                if (y < d.height-1)
                {
                    //Lägg till pixeln längst
                    //ner till höger
                    //om pixeln i centrum.
                    r+=lr[(x+1)+(y+1)*d.width];
                    g+=lg[(x+1)+(y+1)*d.width];
                    b+=lb[(x+1)+(y+1)*d.width];
                    div++;
                }
            }
            //Vi måste dividera med "div" som
            //egentligen bara säger hur många
            //pixlar vi har manipulerat.
            r/=div;
            g/=div;
            b/=div;

            //Till sist så bygger vi upp pixelvärdet igen.
            pixels[x+y*d.width]=0xff000000+(r < < 16)+(g < < 8)+b;
        }
    }
    //Nur återstår bara att återskapa bilden och returnera den.
    MemoryImageSource imgsrc
        =new MemoryImageSource(d.width,d.height,pixels,0,d.width);
    img=createImage(imgsrc);
    return img;
}

public void paint(Graphics g)
{
    if (image!=null) g.drawImage(image,0,0,this);
}

}