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
|
package p004;
import com.sun.media.jai.widget.DisplayJAI;
import java.awt.BorderLayout;
import java.awt.color.ColorSpace;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.awt.image.renderable.ParameterBlock;
import javax.media.jai.Interpolation;
import javax.media.jai.JAI;
import javax.media.jai.KernelJAI;
import javax.media.jai.PlanarImage;
import javax.media.jai.RenderedOp;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.WindowConstants;
/**
*
* @author Jeffrey
*/
class CoupeMiniere extends JFrame implements MouseListener {
/**
* Les deux images sur lesquels nous allons travailler
*/
BufferedImage image,petiteImage;
/**
* L'echelle de la petite image
*/
float scale;
/**
* Les positions des clics souri
*/
int[] position;
/**
* La taille des cotés du cadre dans lequel la convolution s'effectuera
*/
float c=120F;
/**
* Booleen qui permet de stoper le programme en attendant un clic souri
*/
boolean sortie=false;
public CoupeMiniere(String cheminImage, float tempScale) {
scale=tempScale;
System.out.print("Chargement de l image... ");
RenderedOp temp = JAI.create("fileload", cheminImage);
image = temp.getAsBufferedImage();
System.out.println("done");
System.out.print("Modification de l image en niveau de gris... ");
ColorSpace graySpace = ColorSpace.getInstance(ColorSpace.CS_GRAY);
ColorConvertOp ccOP = new ColorConvertOp(graySpace, null);
BufferedImage grayImage = ccOP.filter(image, null);
image = grayImage;
System.out.println("done");
System.out.print("Creation d une petite image pour l affichage... ");
Interpolation interp = Interpolation.getInstance(Interpolation.INTERP_BILINEAR);
ParameterBlock params = new ParameterBlock();
params.addSource(image);
params.add(scale); // x scale factor
params.add(scale); // y scale factor
params.add(0.0F); // x translate
params.add(0.0F); // y translate
params.add(interp); // interpolation method
RenderedOp scaledImage = JAI.create("scale", params);
petiteImage = scaledImage.getAsBufferedImage();
System.out.println("done");
}
public int[] selection() {
System.out.print("Creation de la fenetre de selection... ");
DisplayJAI dj = new DisplayJAI (petiteImage);
dj.addMouseListener(this);
int Height = petiteImage.getHeight();
int Width = petiteImage.getWidth();
JFrame frame = new JFrame("Selection");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(new JScrollPane (dj), BorderLayout.CENTER);
frame.setVisible(true);
frame.pack();
System.out.println("done");
System.out.print("Attente d un clic...");
do{
}while(sortie==false);
sortie=false;
System.out.println("done");
frame.dispose();
position[0]=(int)(position[0]/scale);
position[1]=(int)(position[1]/scale);
return position;
}
public int[] noeud(int X, int Y){
System.out.print("Decoupe d une partie d image...");
PlanarImage pImage = PlanarImage.wrapRenderedImage(image);
float x,y;
x=(float)(X-(c/2));
y=(float)(Y-(c/2));
ParameterBlock pb = new ParameterBlock();
pb.addSource(pImage);
pb.add(x);
pb.add(y);
pb.add(c);
pb.add(c);
RenderedOp crop = JAI.create("crop",pb);
System.out.println("done");
System.out.print("Application d une convolution a l image...");
float[] data = new float[64];
data[0]=-1F;data[1]=-1F;data[2]=1F;data[3]=1F;data[4]=1F;data[5]=1F;data[6]=-1F;data[7]=-1F;
data[8]=-1F;data[9]=-1F;data[10]=1F;data[11]=1F;data[12]=1F;data[13]=1F;data[14]=-1F;data[15]=-1F;
data[16]=1F;data[17]=1F;data[18]=1F;data[19]=1F;data[20]=1F;data[21]=1F;data[22]=1F;data[23]=1F;
data[24]=1F;data[25]=1F;data[26]=1F;data[27]=1F;data[28]=1F;data[29]=1F;data[30]=1F;data[31]=1F;
data[32]=1F;data[33]=1F;data[34]=1F;data[35]=1F;data[36]=1F;data[37]=1F;data[38]=1F;data[39]=1F;
data[40]=1F;data[41]=1F;data[42]=1F;data[43]=1F;data[44]=1F;data[45]=1F;data[46]=1F;data[47]=1F;
data[48]=-1F;data[49]=-1F;data[50]=1F;data[51]=1F;data[52]=1F;data[53]=1F;data[54]=-1F;data[55]=-1F;
data[56]=-1F;data[57]=-1F;data[58]=1F;data[59]=1F;data[60]=1F;data[61]=1F;data[62]=-1F;data[63]=-1F;
KernelJAI kernel = new KernelJAI(8,8,data);
RenderedOp temp = JAI.create("convolve", crop, kernel);
BufferedImage conv = temp.getAsBufferedImage();
System.out.println("done");
System.out.print("Recherche du point...");
int[] point={0,0};
int min= conv.getRGB(20,20),i,j;
for(i=20;i<100;i++){
for(j=20; j<100;j++){
if(conv.getRGB(i,j)<min){
point[0]=i;
point[1]=j;
}
}
}
System.out.println("point :"+point[0]+"x"+point[1]);
point[0]= point[0]+X-(int) (c/2);
point[1]= point[1]+Y-(int) (c/2);
System.out.println("done");
return point;
}
public void mouseClicked(MouseEvent e) {
int[] temp = {e.getX(),e.getY()};
position = temp;
sortie = true;
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
} |
Partager