Ce programme permet de créer un pochoir à partir d'une photo.
Des pochoirs multi-couches peuvent être réalisés mais l'interface graphique ne permet de ne créer que des pochoirs simples
Source / Exemple :
package fr.julien.stencil.metier;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
/**
- <b>Stencil est la classe qui permet de définir un pochoir</b>
- <p>
- Cette classe est caractérisée par les informations suivantes :
- <ul>
- <li>L'image servant à créer le pochoir</li>
- <li>Les bornes permettant de définir les contours</li>
- </ul>
- </p>
- <p>
- De plus, cette classe contient un tableau de couleurs rgb qui permet de
- définir les couleurs à appliquer entre chacune des bornes définies
- dans l'intervalle des rgb
- </p>
- <p>
- Cette classe contient également des méthodes permettant de modifier les
- bornes, d'afficher des stats sur l'image et de créer les pochoirs.
- </p>
-
- @author Julien
- @version 1.0
*
public class Stencil {
/**
- L'image servant de base pour le pochoir
- /
private BufferedImage image;
/**
- Les bornes dans l'intervalle des couleurs rgb
- /
private List<Integer> bornes;
/**
- Les couleurs à utiliser entre chacune des bornes
- /
public static int[] colors = new int[]{-16777216, -1, -14336};
/**
- <b>Constructeur de pochoir</b>
- @param nbLayer
- Le nombre de bornes à utiliser
- @param image
- L'image de référence
- /
public Stencil(int nbLayer, File image) {
bornes = new ArrayList<Integer>();
try {
this.image = ImageIO.read(image);
for(int i=0; i<nbLayer; i++){
bornes.add(getRGBMoyen());
}
}
catch (IOException e) {
e.printStackTrace();
}
}
/**
- Méthode permettant de créer les images correspondant aux pochoirs
- @return les pochoirs
- /
public List<Image> getStencils(){
List<Image> images = new ArrayList<Image>();
int w = image.getWidth();
int h = image.getHeight();
BufferedImage bimg = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
int[] rgbs = new int[w*h];
image.getRGB(0,0,w,h,rgbs,0,w);
bimg.getRaster().setDataElements(0, 0, w, h, rgbs);
for(int i=0; i<w; i++){
for(int j=0; j<h; j++){
int rgb = image.getRGB(i,j);
bimg.setRGB(i,j,colors[determinerIntervalle(rgb)]);
}
images.add(bimg);
}
return images;
}
/**
- Méthode permettant de détermienr la couleur à utiliser pour un rgb
- @param indice
- La couleur du rgb
- @return la couleur à utiliser
- /
private int determinerIntervalle(int indice){
int res=0;
boolean ok=false;
for(int i=0; i<bornes.size(); i++){
if(indice<bornes.get(i)){
res=i;
ok=true;
break;
}
}
if(!ok){
res=bornes.size();
}
return res;
}
/**
- Fonction permettant d'afficher des stats sur l'image
- afin de définir les bornes à utiliser
- /
public void printStats(){
int w = image.getWidth();
int h = image.getHeight();
int[] rgbs = new int[w*h];
image.getRGB(0,0,w,h,rgbs,0,w);
int min=rgbs[0];
int max=rgbs[0];
for(int i=0; i<w*h; i++){
if(rgbs[i]>max){
max=rgbs[i];
}
if(rgbs[i]<min){
min=rgbs[i];
}
}
System.out.println("Moyenne : "+getRGBMoyen());
System.out.println("Minimum : "+min);
System.out.println("Maximum : "+max);
}
/**
- Fonction retournant le rgb moyen de l'image
- @return le rgb moyen de l'image
- /
public int getRGBMoyen(){
int w = image.getWidth();
int h = image.getHeight();
int[] rgbs = new int[w*h];
image.getRGB(0,0,w,h,rgbs,0,w);
int moyenne=0;
for(int i=0; i<w*h; i++){
moyenne+=rgbs[i]/(w*h);
}
return moyenne;
}
/**
- Fonction retournant la largeur de l'image
- @return la largeur de l'image
- /
public int getWidth(){
return image.getWidth();
}
/**
- Fonction retournant la hauteur de l'image
- @return la hauteur de l'image
- /
public int getHeight(){
return image.getHeight();
}
/**
- Méthode d'acces à l'image de référence
- @return l'image
- /
public BufferedImage getImage() {
return image;
}
/**
- Méthode d'accès aux bornes de l'image
- @return les bornes
- /
public List<Integer> getBornes() {
return bornes;
}
}