//Import av nödvändiga klasser import java.applet.*; import java.awt.*; import java.awt.event.*; import java.awt.image.*; import javax.swing.*; /** * MINT - Uppgift 2e * En applet som visar en bild som man kan förändra genom att * applicera två olika filter. * * @author Blanca Larkeson */ public class FilterApplet extends Applet implements ActionListener { private Image bilden; private BildPanel bildPanel; private Panel knappPanel; private Button button1, button2, button3; private Cursor c; //Initiering av appleten och placering av komponenter public void init(){ setSize(350, 250); setLayout(new BorderLayout()); bilden = getImage(getCodeBase(), "sunflower.jpg"); bildPanel = new BildPanel(bilden); add(bildPanel, BorderLayout.CENTER); knappPanel = new Panel(); knappPanel.setBackground(new Color(153, 255, 102)); add(knappPanel, BorderLayout.SOUTH); button1 = new Button(" Inversfilter "); button1.setBackground(new Color(204, 255, 255)); c = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); button1.setCursor(c); button1.addActionListener(this); knappPanel.add(button1); button2 = new Button(" Gråfilter "); button2.setBackground(new Color(204, 255, 255)); button2.setCursor(c); button2.addActionListener(this); knappPanel.add(button2); button3 = new Button(" Återställ "); button3.setBackground(new Color(204, 255, 255)); button3.setCursor(c); button3.addActionListener(this); knappPanel.add(button3); } //Metod som lyssnar till knapphändelser public void actionPerformed(ActionEvent event){ Object source = event.getSource(); if (source == button1) { bildPanel.filter(new NegativFilter()); } if (source == button2) { bildPanel.filter(new GreyFilter()); } if (source == button3) { bildPanel.clean(); } } //En innre klass som innehåller hjälpmetoder för bildomvandling class BildPanel extends JPanel{ private Image bild; private ImageFilter filter; private MediaTracker mt; public BildPanel(Image bild){ super(); this.bild = bild; mt = new MediaTracker(this); mt.addImage(bild, 1); try{ mt.waitForAll(); }catch(Exception e){ System.out.println("BILDPROBLEM: " + e); System.exit(1); } this.setBackground(new Color(250, 250, 250)); } //Bilden ritas ut public void paintComponent(Graphics g){ super.paintComponent(g); g.drawImage(bild, 80, 15,this); } //Ny bild skapas efter applicering av filter public void filter(ImageFilter newFilter) { filter = newFilter; ImageProducer ip = bilden.getSource(); FilteredImageSource fiSource = new FilteredImageSource(ip, filter); bild = createImage(fiSource); mt.addImage(bild, 1); repaint(); } //Den ursprungliga bilden återskapas public void clean(){ bild = bilden; mt.addImage(bild, 1); repaint(); } } //Filter som inverterar en bild till ett negativ class NegativFilter extends ImageFilter { public void setPixels(int x, int y, int width, int height, ColorModel model, int[] pixels, int offset, int scansize) { int pixie[] = new int[width*height]; int compo[] = new int[3]; for(int i = 0; i < width; i++){ for(int j = 0; j < height; j++){ int index = i + (j*scansize) + offset; compo = model.getComponents(pixels[index], compo, 0); compo[0] = 255 - compo[0]; //Rött compo[1] = 255 - compo[1]; //Grönt compo[2] = 255 - compo[2]; //Blått pixie[index] = (int)model.getDataElement(compo, 0); } } super.setPixels(x, y, width, height, model, pixie, offset, scansize); } public void setHints(int hint) { hint |= ImageConsumer.TOPDOWNLEFTRIGHT; super.setHints(hint); } } //Filter som producerar en kontrastsänkande grå bild class GreyFilter extends ImageFilter { public void setPixels(int x, int y, int width, int height, ColorModel model, int[] pixels, int offset, int scansize){ int pixie[] = new int[width*height]; int compo[] = new int[3]; for(int i = 0; i < width; i++){ for(int j = 0; j < height; j++){ int index = i + (j*scansize) + offset; compo = model.getComponents(pixels[index], compo, 0); compo[0]/=3; //Rött compo[1]/=3; //Grönt compo[2]/=3; //Blått compo[0]+=50; //Rött compo[1]+=50; //Grönt compo[2]+=50; //Blått pixie[index] = (int)model.getDataElement(compo,0); } } super.setPixels(x, y, width, height, model, pixie, offset, scansize); } public void setHints(int hint) { hint |= ImageConsumer.TOPDOWNLEFTRIGHT; super.setHints(hint); } } }