Créateur de pochoirs

Soyez le premier à donner votre avis sur cette source.

Vue 4 428 fois - Téléchargée 337 fois

Description

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; } }

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_Julien39
Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
248 -
Je viens de recevoir un MP un message de jjb13111 :

je n'y connait rien en java ni en eclipse, et donc je n'ai pas pu lancer le lanceur manuel..... impossible de trouver comment paramétrer le path de la photo. Pour le lanceur swing aucun probleme, vu qu'il le determine tout seul ^o^, mais , j'aurais bien voulu voir ce que donnait les differentes couches et les possibilités offertes d'extractions. Ca doit etre simple, mais avec mes connaissances , on frole l'explosion de neurone. Donc si vous avez une petite explication, ca me servirait grandement
Cordialement,
JJB
cs_Julien39
Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
248 -
Je réponds donc ici, histoire que la réponse profite à tous :
Pour lancer manuelement le programme :
public static void main(String[] args){
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// ICI, ON ENTRE LE PATH VERS L'IMAGE
Stencil stencil = new Stencil(1, new File("D:\\IMG_3755.JPG"));

stencil.printStats();
stencil.getBornes().set(0, -9495915);
//stencil.getBornes().set(1, -376434);
PanelImage panel = new PanelImage(stencil.getStencils().get(1));
f.add(panel);
panel.setPreferredSize(new Dimension(stencil.getWidth(), stencil.getHeight()));
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);

//SI ON VEUT ENREGISTRER L'IMAGE ON DECOMMENTE CETTE PARTIE

// try {
// // ON ENTRE ICI LE CHEMIN VERS LE FICHIER IMAGE EN SORTIE
// new EnregistreurContainer(panel).enregistrerImage("D:\\c.jpg");
// }
// catch (IOException e) {
// e.printStackTrace();
// }
}
cs_Julien39
Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
248 -
Pour un pochoir multi couches, c'est un peu plus compliqué :
Dans le lanceur :
Stencil stencil = new Stencil(2, new File("D:\\IMG_3755.JPG"));

Ensuite, il faut définir manuelement les bornes :
stencil.getBornes().set(0, -676434);
stencil.getBornes().set(1, -376434);

Pour plus de deux couches, il faudra ajouter des rgb dans le tableau colors dans la classe Stencil

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.