1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224
|
package loupe;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.ShortLookupTable;
import java.awt.image.LookupOp;
/**
* Classe permettant de faire une conversion de couleur d'une image.<br><br>
* Conversion Possible :<br>
* - Noir et Blanc<br>
* - Couleur inversée<br>
* - Rouge prédominant<br>
* - Vert prédominant<br>
* - Bleu prédominant<br>
*
*/
public class SelectionCouleur
{
private short inversion[] = new short[256];
private short[][] vert;
private short[][] rouge;
private short[][] bleu;
private short[][] renduCouleur1;
private short[][] renduCouleur2;
private short[] table;
private short[] normal;
private Image image;
private static SelectionCouleur selectCouleurInstance;
private SelectionCouleur()
{
table = new short[256];
normal = new short[256];
short [] inverseCouleur = new short[256];
for (int i = 0; i < 256; i++)
{
normal[i] = (short)i;
table[i] = 0;
inverseCouleur[i] = (short)(255 - i);
}
this.vert = new short [][]{ table, normal, table};
this.rouge = new short [][]{ normal, table, table};
this.bleu = new short [][]{ table, table, normal};
renduCouleur1 = new short [][]{normal, normal, inverseCouleur};
renduCouleur2 = new short [][] {inverseCouleur, normal, normal};
}
public static SelectionCouleur getSelectionCouleurInstance(){
if (selectCouleurInstance == null){
selectCouleurInstance = new SelectionCouleur();
}
return selectCouleurInstance;
}
/**
* Cette fonction a pour but d'inverser les couleurs de l'image passée
* en paramètre.
*
* @param img Image dont les couleurs vont changer
* @param width Largeur de l'image
* @param height Hauteur de l'image
*/
private Image inversionCouleur(Image img, int width, int height)
{
//création d'une instance de shortLookUpTable pour une table de conversion de short
ShortLookupTable table = new ShortLookupTable(0, inversion);
LookupOp op = new LookupOp(table, null);
BufferedImage filteredImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
op.filter((BufferedImage)img, filteredImage); //application de l'opération op sur l'image source image à l'image destination filteredImage
return filteredImage;
}
/**
* Cette fonction a pour but de mettre l'image passée en paramètre en
* noir et blanc.
*
* @param img Image source
*/
private Image noirEtBlanc(Image img, int width, int height)
{
BufferedImage filteredImage = new BufferedImage(width,height,BufferedImage.TYPE_BYTE_GRAY);
Graphics g = filteredImage.createGraphics();
g.drawImage(img,0,0,null);
g.dispose();
return filteredImage;
}
/**
* Cette fonction a pour but de mettre l'image passée en paramètre avec
* une couleur verte prédominante.
*
* @param img Image source
* @param width Largeur de l'image
* @param height Hauteur de l'image
*/
private Image vertPredomine(Image img, int width, int height)
{
ShortLookupTable invertTable = new ShortLookupTable(0, vert);
//System.out.println("table du vert chargée");
LookupOp op = new LookupOp(invertTable, null);
BufferedImage filteredImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//application de l'opération op sur l'image source image à l'image destination filteredImage
image = img;
op.filter((BufferedImage)image, filteredImage);
return filteredImage;
}
/**
* Cette fonction a pour but de mettre l'image passée en paramètre avec
* une couleur rouge prédominante.
*
* @param img Image source
* @param width Largeur de l'image
* @param height Hauteur de l'image
*/
private Image rougePredomine(Image img, int width, int height)
{
ShortLookupTable invertTable = new ShortLookupTable(0, rouge);
//System.out.println("table du rouge chargée");
LookupOp op = new LookupOp(invertTable, null);
BufferedImage filteredImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//application de l'opération op sur l'image source image à l'image destination filteredImage
op.filter((BufferedImage)img, filteredImage);
return filteredImage;
}
/**
* Cette fonction a pour but de mettre l'image passée en paramètre avec
* une couleur bleu prédominante.
*
* @param img Image source
* @param width Largeur de l'image
* @param height Hauteur de l'image
*/
private Image bleuPredomine(Image img, int width, int height)
{
ShortLookupTable invertTable = new ShortLookupTable(0, bleu);
//System.out.println("table du bleu chargée");
LookupOp op = new LookupOp(invertTable, null);
BufferedImage filteredImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//image = img;
//application de l'opération op sur l'image source image à l'image destination filteredImage
op.filter((BufferedImage)img, filteredImage);
return filteredImage;
}
/**
* Cette fonction a pour but de mettre l'image passée en paramètre avec
* un rendu de couleurs (type 1).
*
* @param img Image source
* @param width Largeur de l'image
* @param height Hauteur de l'image
*/
private Image inverseCouleur1(Image img, int width, int height)
{
ShortLookupTable invertTable = new ShortLookupTable(0, renduCouleur1);
LookupOp op = new LookupOp(invertTable, null);
BufferedImage filteredImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//application de l'opération op sur l'image source image à l'image destination filteredImage
op.filter((BufferedImage)img, filteredImage);
return filteredImage;
}
/**
* Cette fonction a pour but de mettre l'image passée en paramètre avec
* un rendu de couleurs (type 2).
*
* @param img Image source
* @param width Largeur de l'image
* @param height Hauteur de l'image
*/
private Image inverseCouleur2(Image img, int width, int height)
{
ShortLookupTable invertTable = new ShortLookupTable(0, renduCouleur2);
LookupOp op = new LookupOp(invertTable, null);
BufferedImage filteredImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//application de l'opération op sur l'image source image à l'image destination filteredImage
op.filter((BufferedImage)img, filteredImage);
return filteredImage;
}
/**
*
* @param img Image à modifier
* @param width Largeur de l'image
* @param height Hauteur de l'image
* @param choix Choix disant comment modifier l'image
* @return Image modifiée (bleu prédominant ou vert prédominant ou...)
*/
public Image getImageModifiee(Image img, int width,int height,int choix)
{
if(choix == PaletteCouleurs.COULEUR_INVERSEE)
return inversionCouleur(img, width, height);
if(choix == PaletteCouleurs.BLEU_PREDOMINANT)
return bleuPredomine(img, width, height);
if(choix == PaletteCouleurs.NOIR_ET_BLANC)
return noirEtBlanc(img,width,height);
if(choix == PaletteCouleurs.RENDU_COULEUR_1)
return inverseCouleur1(img, width, height);
if(choix == PaletteCouleurs.RENDU_COULEUR_2)
return inverseCouleur2(img, width, height);
if(choix == PaletteCouleurs.ROUGE_PREDOMINANT)
return rougePredomine(img, width, height);
if(choix == PaletteCouleurs.NORMAL)
return img;
return vertPredomine(img, width, height);
} |
Partager