import imp.*;
import java.awt.Color;
import java.util.Random;

/**
 * Algorithmen, die auf der Veränderung der Farbinformationen eines Punktes beruhen
 *
 * @author Thomas Schaller  
 * @version 1.0 (7.11.2019)
 */
public class Punktoperationen 
{

    public  Picture graustufenDurchschnitt(Picture originalbild) {
        int breite = originalbild.getWidth();
        int hoehe  = originalbild.getHeight();

        Color[][] pixel = originalbild.getPixelArray();
        Color[][] pixelNeu = new Color[breite][hoehe];
       
        for(int x=0; x < breite; x++) {
            for(int y=0;y < hoehe; y++) {
                // Mittelwert bestimmen
                int grau = (int) ((pixel[x][y].getRed()+ pixel[x][y].getGreen() + pixel[x][y].getBlue())/3);
                pixelNeu[x][y] = new Color(grau, grau, grau);
            }
        }
        
        Picture neuesBild = new Picture();
        neuesBild.setPixelArray(pixelNeu); 
        return neuesBild;
    }


    public  Picture graustufenMin(Picture originalbild) {
        int breite = originalbild.getWidth();
        int hoehe  = originalbild.getHeight();

        Color[][] pixel = originalbild.getPixelArray();
        Color[][] pixelNeu = new Color[breite][hoehe];
       
        for(int x=0; x < breite; x++) {
            for(int y=0;y < hoehe; y++) {
               int grau = pixel[x][y].getRed();
               if (grau > pixel[x][y].getGreen()) grau = pixel[x][y].getGreen();
               if (grau > pixel[x][y].getBlue())  grau = pixel[x][y].getBlue();
               pixelNeu[x][y] = new Color(grau, grau, grau);
            }
        }
        Picture neuesBild = new Picture(); 
        neuesBild.setPixelArray(pixelNeu);  
        return neuesBild;
    }

    public  Picture graustufenMax(Picture originalbild) {
        int breite = originalbild.getWidth();
        int hoehe  = originalbild.getHeight();

        Color[][] pixel = originalbild.getPixelArray();
        Color[][] pixelNeu = new Color[breite][hoehe];
       
        for(int x=0; x < breite; x++) {
            for(int y=0;y < hoehe; y++) {
               int grau = pixel[x][y].getRed();
               if (grau < pixel[x][y].getGreen()) grau = pixel[x][y].getGreen();
               if (grau < pixel[x][y].getBlue())  grau = pixel[x][y].getBlue();
               pixelNeu[x][y] = new Color(grau, grau, grau);
            }
        }
        Picture neuesBild = new Picture(); 
        neuesBild.setPixelArray(pixelNeu); 
        return neuesBild;
    }


    public  Picture graustufenNatuerlich(Picture originalbild) {
        int breite = originalbild.getWidth();
        int hoehe  = originalbild.getHeight();

        Color[][] pixel = originalbild.getPixelArray();
        Color[][] pixelNeu = new Color[breite][hoehe];
       
        for(int x=0; x < breite; x++) {
            for(int y=0;y < hoehe; y++) {
               int grau = (int) (pixel[x][y].getRed()*299+pixel[x][y].getGreen()*587+pixel[x][y].getBlue()*114)/1000;
               pixelNeu[x][y] = new Color(grau, grau, grau);
            }
        }
        Picture neuesBild = new Picture();
        neuesBild.setPixelArray(pixelNeu);
        return neuesBild;
    }


    public  Picture invertieren(Picture originalbild) {
        int breite = originalbild.getWidth();
        int hoehe  = originalbild.getHeight();

        Color[][] pixel = originalbild.getPixelArray();
        Color[][] pixelNeu = new Color[breite][hoehe];
       
        for(int x=0; x < breite; x++) {
            for(int y=0;y < hoehe; y++) {
                int rot = 255-pixel[x][y].getRed();
                int gruen = 255-pixel[x][y].getGreen();
                int blau = 255-pixel[x][y].getBlue();
                pixelNeu[x][y] = new Color(rot, gruen, blau);
            } 
        }
        Picture neuesBild = new Picture(); 
        neuesBild.setPixelArray(pixelNeu);
        return neuesBild;
    }

    public  Picture tauschRotGruen(Picture originalbild) {
        int breite = originalbild.getWidth();
        int hoehe  = originalbild.getHeight();

        Color[][] pixel = originalbild.getPixelArray();
        Color[][] pixelNeu = new Color[breite][hoehe];
       
        for(int x=0; x < breite; x++) {
            for(int y=0;y < hoehe; y++) {
                int rot = pixel[x][y].getGreen();
                int gruen = pixel[x][y].getRed();
                int blau = pixel[x][y].getBlue();
                pixelNeu[x][y] = new Color(rot, gruen, blau);
            } 
        }
        Picture neuesBild = new Picture(); 
        neuesBild.setPixelArray(pixelNeu);
        return neuesBild;
    }

    public  Picture tauschRotBlau(Picture originalbild) {
        int breite = originalbild.getWidth();
        int hoehe  = originalbild.getHeight();

        Color[][] pixel = originalbild.getPixelArray();
        Color[][] pixelNeu = new Color[breite][hoehe];
       
        for(int x=0; x < breite; x++) {
            for(int y=0;y < hoehe; y++) {
                int rot = pixel[x][y].getBlue();
                int gruen = pixel[x][y].getGreen();
                int blau = pixel[x][y].getRed();
                pixelNeu[x][y] = new Color(rot, gruen, blau);
            } 
        }
        Picture neuesBild = new Picture(); 
        neuesBild.setPixelArray(pixelNeu);
        return neuesBild;
    }
    
    public  Picture tauschGruenBlau(Picture originalbild) {
        int breite = originalbild.getWidth();
        int hoehe  = originalbild.getHeight();

        Color[][] pixel = originalbild.getPixelArray();
        Color[][] pixelNeu = new Color[breite][hoehe];
       
        for(int x=0; x < breite; x++) {
            for(int y=0;y < hoehe; y++) {
                int rot = pixel[x][y].getRed();
                int gruen = pixel[x][y].getBlue();
                int blau = pixel[x][y].getGreen();
                pixelNeu[x][y] = new Color(rot, gruen, blau);
            } 
        }
        Picture neuesBild = new Picture(); 
        neuesBild.setPixelArray(pixelNeu);
        return neuesBild;
    }

    public  Picture farbaenderung(Picture originalbild, double faktor_r, double faktor_g, double faktor_b) {
        int breite = originalbild.getWidth();
        int hoehe  = originalbild.getHeight();

        Color[][] pixel = originalbild.getPixelArray();
        Color[][] pixelNeu = new Color[breite][hoehe];
       
        for(int x=0; x < breite; x++) {
            for(int y=0;y < hoehe; y++) {
                int rot   = (int) (pixel[x][y].getRed()   * faktor_r);
                int gruen = (int) (pixel[x][y].getGreen() * faktor_g);
                int blau  = (int) (pixel[x][y].getBlue()  * faktor_b);
                
                //Begrenzung auf zulässigen Bereich
                if(rot < 0)     rot   = 0;   
                if(rot > 255)   rot   = 255;
                if(gruen < 0)   gruen = 0; 
                if(gruen > 255) gruen = 255;
                if(blau < 0)    blau  = 0;  
                if(blau > 255)  blau  = 255;
                
                pixelNeu[x][y] = new Color(rot, gruen, blau);
            } 
        }
        Picture neuesBild = new Picture(); 
        neuesBild.setPixelArray(pixelNeu); 
        return neuesBild;
    }


}
