//albnegruFilter1.java

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



public class albnegruFilter1 extends Applet
{
  Image img,imgn,histo;
  Graphics g;
  int dimlat,dimin;  //dimensiuni imagine img
  int lat,inalt;  //dimensiuni imgn
  String valoare="128"; 
  Panel p=new Panel();
  Label lbl=new Label("Valoare intre 0 si 255:");
  List lstT=new List(1,false);
  Button ok=new Button("OK");
  public void init()
   {
       Color culoare=new Color(100,100,50);
       setBackground(culoare);
       String imaginea=getParameter("imagine");
       if (imaginea==null)
           imaginea="Andreea1.jpg" ;
       img=getImage(getCodeBase(), imaginea);
    dimlat=img.getWidth(this);
    dimin=img.getHeight(this);
    imgn=img;
//  MemoryImageSource mis;                 
    Image rimg;
    
    for (int i=0;i<52;i++)
        lstT.addItem(String.valueOf(5*i));
    lstT.makeVisible(25);
    lstT.select(25);
    setLayout(new BorderLayout());
    p.add(new Button("Albnegru 1"));
    p.add(new Button("Albnegru 2"));
    p.add(new Button("Binar"));
    p.add(lbl);
    p.add(lstT);
    p.add(ok);
    lstT.disable();
    lbl.disable();
    ok.disable();
    add("North",p);
   
  }
 
 public boolean action(Event evt, Object ob)
{
  Graphics g=getGraphics();
  g.clearRect(60,100+dimin,60+lat,100+dimin+inalt);
  g.dispose();
    if (evt.target instanceof Button)
  {
    
    if (ob.equals("Albnegru 1"))
      {
        lstT.disable();
        lbl.disable();
        ok.disable();
        albnegru1 rim5=new albnegru1(img);
        imgn=rim5.rimg;
  
    }  
    else if (ob.equals("Albnegru 2"))
      {
          lstT.disable();
          lbl.disable();
          ok.disable();
          ImageFilter mono=new albnegruFilter();  
          ImageProducer produc=new FilteredImageSource(img.getSource(), mono); 
          imgn=createImage(produc);
      }  
    else if (ob.equals("Binar")) {
       lstT.enable();
       lbl.enable();
       ok.enable();
      } 
    else if (ob.equals("OK"))
      {
        
        valoare=lstT.getSelectedItem();
        System.out.println(valoare);
          int val=Integer.parseInt(valoare);
        if ((val>=0) && (val<=255)) {
            ImageFilter bin=new binarfilter(val);  
            ImageProducer produc1=new FilteredImageSource(img.getSource(), bin); 
            imgn=createImage(produc1);
          }
        else {
            lbl.setText("Reintroduceti valoarea");
          }
      }   
     repaint();
     return true;
   }
  return false;
}   
 

public void paint(Graphics g)
{
 inalt=imgn.getHeight(this);
 lat=imgn.getWidth(this);
  g.drawImage(img,50,60, this);
  g.drawImage(imgn,80+dimlat,60,this);         
  g.drawImage(histo,50,60+dimin,this);
}

}

//  albnegruFilter.java

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


class albnegruFilter extends RGBImageFilter
{
// ColorModel acm=ColorModel.getRGBdefault();

 public  albnegruFilter () {
	canFilterIndexColorModel=true;
  //      this.select=select;
 }
 
 public int filterRGB (int x, int y, int rgb)
 {
 //    int alp=acm.getAlpha(rgb);
     int alp=(rgb>>24) & 0xff;
     int culoarepix=rgb & 0x00FFFFFF;
     int r = (rgb >> 16) & 0xff;
     int g = (rgb >> 8) & 0xff;
     int b = (rgb >> 0) & 0xff;


//     int r=acm.getRed(rgb);
//     int g=acm.getGreen(rgb);
//     int b=acm.getBlue(rgb);
  /*   double x=Math.sqrt(r*r+g*g+b*b);
     double y=Math.sqrt((255-r)*(255-r)+(255-g)*(255-g)+(255-b)*(255-b));
     double z=255*Math.pow(3,0.5);
     double z1=(x*x-y*y+z*z)/(2*z);
     int r1=(int)(z1/(Math.pow(3,0.5)));  */
     int r1=(int)((r+g+b)/3.0f);
     r1=Math.max(0,Math.min(r1,255));
     int g1=r1;
     int b1=r1; 
     
     return (alp<<24) | (r1<<16) | (g1<<8) | (b1<<0);
  }

}
 


// albnegru.java

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

public class albnegru extends Applet 
{
  Image rimg;
  
public albnegru(Image source)
  {
 
      ImageFilter mono=new albnegruFilter();  
     ImageProducer produc=new FilteredImageSource(source.getSource(), mono); 
     rimg=createImage(produc);
  }
    
    

//public void paint (Graphics g1)
  //{	
//	g1.drawImage(rimg,250,250,this);
  //}


}



//   albnegru1.java

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

public class albnegru1 extends Applet 
{

 Image rimg;

  albnegru1 (Image source) {
//	canFilterIndexColorModel=true;
	ColorModel cm=ColorModel.getRGBdefault();
	boolean success;
        int widtho,heighto,oldi;
	int[] Pixo,Pixn;
	int pixelval;
	
	PixelGrabber pg;
	widtho = source.getWidth(this);
	heighto = source.getHeight(this);


	Pixo = new int[widtho*heighto];     
	Pixn = new int[widtho*heighto];     

	pg = new PixelGrabber(source.getSource(), 0,0,widtho,heighto,Pixo,0,widtho);

	try
	{
		success = pg.grabPixels(0);             
	}                                                                      
	catch (Exception e)
	{
		System.out.println("Eroare!! " + e);
	}

	for (int y=0; y < heighto; y++)
	{
	   for (int x=0; x < widtho; x++)
	   {
		int r=cm.getRed(Pixo[y*widtho+x]);
		int g=cm.getGreen(Pixo[y*widtho+x]);
		int b=cm.getBlue(Pixo[y*widtho+x]);
		int alp=cm.getAlpha(Pixo[y*widtho+x]);
                double xx=Math.sqrt(r*r+g*g+b*b);
                double yy=Math.sqrt((255-r)*(255-r)+(255-g)*(255-g)+(255-b)*(255-b));
                double zz=255*Math.pow(3,0.5);
                double z1=(xx*xx-yy*yy+zz*zz)/(2*zz);
                int r1=(int)(z1/(Math.pow(3,0.5)));  

//                int r1=(int)((r+g+b)/3.0f);
                r1=Math.max(0,Math.min(r1,255));
                int g1=r1;
                int b1=r1; 
		Pixn[y*widtho+x]=(alp<<24) | (r1<<16) | (g1<<8) | (b1<<0);
	   }
	}

	rimg = createImage(new MemoryImageSource(widtho,heighto,Pixn,0,widtho));
  }
    
}



//  binarfilter.java

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



public class binarfilter extends RGBImageFilter
{
    int valoare;
    
    public  binarfilter (int valoare) {
	canFilterIndexColorModel=true;
        this.valoare=valoare;
 }
 
 public int filterRGB (int x, int y, int rgb)
 {
 //    int alp=acm.getAlpha(rgb);
     int alp=(rgb>>24) & 0xff;
     int culoarepix=rgb & 0x00FFFFFF;
     int r = (rgb >> 16) & 0xff;
     int g = (rgb >> 8) & 0xff;
     int b = (rgb >> 0) & 0xff;

     int r1=(int)((r+g+b)/3.0f);
     r1=Math.max(0,Math.min(r1,255));
     if (r1>=valoare) r1=255;
     else r1=0;
     int g1=r1;
     int b1=r1; 
     return (alp<<24) | (r1<<16) | (g1<<8) | (b1<<0);
  }

    
    
    
}