Floutage en java
pegazx
Messages postés
24
Statut
Membre
-
KX Messages postés 19031 Statut Modérateur -
KX Messages postés 19031 Statut Modérateur -
Bonjour,
j'ai un programme qui est censé flouter mais il ne fonctionne pas, il ne fait que le niveau de gris malgré le filtre inséré...
pourriez vous m'aider ?
merci
j'ai un programme qui est censé flouter mais il ne fonctionne pas, il ne fait que le niveau de gris malgré le filtre inséré...
pourriez vous m'aider ?
merci
package pack_TI;
import pack_TI.JImageViewer;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.border.LineBorder;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class TI extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
private JPanel contentPane;
private JButton btnNewButton;
private JFileChooser fc;
private BufferedImage bufImgSource=null;
private BufferedImage bufImgInter=null;
private BufferedImage bufImgDest=null;
private JImageViewer imgSourceViewer=null;
private JImageViewer imgDestViewer=null;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
TI frame = new TI();
frame.setVisible(true);
}
catch (Exception e) {
e.printStackTrace();
}
}
});
}
public TI() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(50, 50, 1020, 475);
setTitle("Traitement d'images");
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(new BorderLayout(0, 0));
JPanel panel_0 = new JPanel();
panel_0.setBorder(new LineBorder(new Color(0, 0, 0)));
contentPane.add(panel_0, BorderLayout.NORTH);
btnNewButton = new JButton("Ouvrir l'image");
btnNewButton.addActionListener(this);
panel_0.add(btnNewButton);
JPanel panel_1 = new JPanel();
panel_1.setBorder(new LineBorder(new Color(0, 0, 0)));
panel_1.setLayout(new BorderLayout(0, 0));
JPanel panel_2 = new JPanel();
panel_2.setBorder(new LineBorder(new Color(0, 0, 0)));
panel_2.setLayout(new BorderLayout(0, 0));
JPanel panel_inter = new JPanel();
panel_inter.setLayout(new GridLayout(1, 2));
panel_inter.add(panel_1);
panel_inter.add(panel_2);
contentPane.add(panel_inter, BorderLayout.CENTER);
JLabel lblImgSource = new JLabel(" Source");
imgSourceViewer=new JImageViewer();
panel_1.add(imgSourceViewer,BorderLayout.CENTER);
panel_1.add(lblImgSource,BorderLayout.SOUTH);
JLabel lblImgDest = new JLabel(" Destination");
imgDestViewer=new JImageViewer();
panel_2.add(imgDestViewer,BorderLayout.CENTER);
panel_2.add(lblImgDest,BorderLayout.SOUTH);
}
@Override
public void actionPerformed(ActionEvent arg0) {
if (arg0.getSource() == btnNewButton){
fc = new JFileChooser("./");
int returnVal = fc.showDialog(null,"Open Image");
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
try {
bufImgSource = ImageIO.read(file);
} catch (IOException e) {
e.printStackTrace();
}
//bufImgDest=ImageEnDegrade();
// 1 traitement
//bufImgDest=Traitement_simple(bufImgSource);
// 2 traitements
bufImgInter=Traitement_simple(bufImgSource);
bufImgDest=Traitement_par_filtage(bufImgInter);
imgSourceViewer.setImage(bufImgSource);
imgDestViewer.setImage(bufImgDest);
repaint();
try {
ImageIO.write(bufImgDest, "gif", new File("./Image_traitee.gif"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* @param source : l'image à traiter
* @return l'image traitée
*/
private static BufferedImage Traitement_simple(BufferedImage source) {
int w = source.getWidth();
int h = source.getHeight();
int[] rgbs = new int[w*h];
rgbs=source.getRGB(0,0,w,h,null,0,w);
int[] newrgbs=new int[rgbs.length];
int rouge = 0;
int vert = 0;
int bleu = 0;
int gris=0;
int pixel=0 ;
int error=0 ;
for (int x = 0 ; x < w ; x++){
for ( int y = 0 ; y < h ; y++){
rouge = ((rgbs[y*w+x] & 0x00ff0000) >> 16) ;
vert = ((rgbs[y*w+x] & 0x0000ff00) >> 8) ;
bleu = (rgbs[y*w+x] & 0x000000ff );
gris = (rouge+vert+bleu)/3;
//Niveau de gris
newrgbs[y*w+x]= (gris << 16) | (gris << 8) | gris;
//newrgbs[y*w+x]= gris;
}
}
BufferedImage dest = new BufferedImage(w,h,source.getType());
dest.setRGB(0,0,w,h,newrgbs,0,w);
return dest;
}
/**
* @param source : l'image à traiter
* @return l'image traitée par le filtre
*/
private static BufferedImage Traitement_par_filtage(BufferedImage source) {
int[] filtre = new int [3*3];
//Filtre Flou
filtre[0] = 1;
filtre[1] = 1;
filtre[2] = 1;
filtre[3] = 1;
filtre[4] = 1;
filtre[5] = 1;
filtre[6] = 1;
filtre[7] = 1;
filtre[8] = 1;
//Calcul diviseur
int diviseur = 0;
for(int count=0; count<9; count++){
diviseur=diviseur+ filtre[count] ;
}
//PARTIE A COMPLETER : calcul du diviseur
int w = source.getWidth();
int h = source.getHeight();
int[] rgbs = new int[w*h];
rgbs=source.getRGB(0,0,w,h,null,0,w);
int[] newrgbs=new int[rgbs.length];
int count;
int pixel=0 , newpixel=0 ;
int v=0 ;
//PARTIE A COMPLETER : application du filtre sur toute l'image
for (int x = 0 ; x < w ; x++){
for ( int y = 0 ; y < h ; y++){
for (int i = x-1 ; i <= (x+1) ; i++){
for (int j = y-1 ; j <= (y+1) ; j++){
if (i>=0 && i<w && j>=0 && j<h)
pixel=pixel + ((rgbs [j*w+i] & 0x0000ff)*filtre[v]) ;
else
pixel=pixel+((rgbs [y*w+x] & 0x0000ff)*filtre[v]) ;
v++;
}
}
if(diviseur!=0)
newpixel=pixel/diviseur ;
else
newpixel = pixel +128;
if (newpixel>255) newpixel=255;
if (newpixel<0) newpixel=0;
pixel=0;
newrgbs [y*w+x] = (newpixel <<16)| (newpixel <<8)| (newpixel) ;
v=0 ;
}
}
BufferedImage dest = new BufferedImage(w,h,source.getType());
dest.setRGB(0,0,w,h,newrgbs,0,w);
return dest;
}
/**
* @return une image en dégradé de couleur
*/
private static BufferedImage ImageEnDegrade() {
int w = 256;
int h = 256;
int r = 0;
int v = 0;
int b = 0xff;
int[] rgbs = new int[w*h];
for (int x = 0 ; x < w ; x++){
for ( int y = 0 ; y < h ; y++){
rgbs [y*w+x] = b|v<<8|r<<16|0xFF000000 ;
}
r++;
v++;
}
// PARTIE A COMPLETER
BufferedImage dest = new BufferedImage(w,h,BufferedImage.TYPE_INT_ARGB);
dest.setRGB(0,0,w,h,rgbs,0,w);
return dest;
}
}
A voir également:
- Floutage en java
- Jeux java itel - Télécharger - Jeux vidéo
- Waptrick java football - Télécharger - Jeux vidéo
- Eclipse java - Télécharger - Langages
- Waptrick java voiture - Télécharger - Jeux vidéo
- Java apk - Télécharger - Langages
2 réponses
Bonsoir,
Ce n'est pas très objet tout ça ! Il faudrait plutôt utiliser les méthodes de la classe Color, getRed(), getGreen(), getBlue(), parce que des BufferedImage il y en a de plusieurs types, avec ou sans transparence, en couleur, en niveaux de gris etc. Rien ne garantie vraiment que la manipulation du code binaire des couleurs donnera vraiment le résultat que tu veux pour tout type d'image !
Ensuite, mélanger les composantes rouge/vert/bleu n'est pas vraiment pertinent, il faudrait plutôt regarder le HSV pour mélanger les teintes, faire varier le contraste etc. Là encore, utilise les méthode de la classe Color, ça sert rien de faire toi même les calculs de conversions...
for (int x = 0 ; x < w ; x++){
for ( int y = 0 ; y < h ; y++){
rouge = ((rgbs[y*w+x] & 0x00ff0000) >> 16) ;
vert = ((rgbs[y*w+x] & 0x0000ff00) >> 8) ;
bleu = (rgbs[y*w+x] & 0x000000ff );
gris = (rouge+vert+bleu)/3;
//Niveau de gris
newrgbs[y*w+x]= (gris << 16) | (gris << 8) | gris;
Ce n'est pas très objet tout ça ! Il faudrait plutôt utiliser les méthodes de la classe Color, getRed(), getGreen(), getBlue(), parce que des BufferedImage il y en a de plusieurs types, avec ou sans transparence, en couleur, en niveaux de gris etc. Rien ne garantie vraiment que la manipulation du code binaire des couleurs donnera vraiment le résultat que tu veux pour tout type d'image !
Ensuite, mélanger les composantes rouge/vert/bleu n'est pas vraiment pertinent, il faudrait plutôt regarder le HSV pour mélanger les teintes, faire varier le contraste etc. Là encore, utilise les méthode de la classe Color, ça sert rien de faire toi même les calculs de conversions...