// FaceColor.java import java.applet.Applet; import java.awt.*; import java.io.*; import java.awt.event.*; import java.awt.image.*; import com.sun.image.codec.jpeg.*; import java.lang.Math.*; /*<applet code="FaceColor.class" width="750" height="400"> <param name="img_" value="h6.jpg"> </applet>*/ public class FaceColor extends Applet{ Image img_; Image img; MediaTracker mt; int w=410,h=307; int[][] color= new int[w*h][3]; Scrollbar bright_min = new Scrollbar(Scrollbar.HORIZONTAL, 128,1,0,255*3+1); Scrollbar bright_max = new Scrollbar(Scrollbar.HORIZONTAL, 255*3,1,0,255*3+1); Scrollbar red_min = new Scrollbar(Scrollbar.HORIZONTAL, 400,1,0,1000+1); Scrollbar red_max = new Scrollbar(Scrollbar.HORIZONTAL, 1000,1,0,1000+1); Scrollbar green_min = new Scrollbar(Scrollbar.HORIZONTAL, 0,1,0,1000+1); Scrollbar green_max = new Scrollbar(Scrollbar.HORIZONTAL, 400,1,0,1000+1); Scrollbar blue_min = new Scrollbar(Scrollbar.HORIZONTAL, 0,1,0,1000+1); Scrollbar blue_max = new Scrollbar(Scrollbar.HORIZONTAL, 400,1,0,1000+1); public void init(){ mt=new MediaTracker(this); setBackground(Color.white); setBackground(Color.white); img_ = getImage(getDocumentBase(), getParameter("img_")); getColor(img_, color, w, h); img=img_; // ボタン設置 Button btn_color = new Button("色抽出"); Button btn_reset = new Button("リセット"); setLayout(new BorderLayout()); Panel p = new Panel(new GridLayout(8,1)); p.setBackground(Color.white); Panel p_color1 = new Panel(new GridLayout(2,3)); p_color1.setBackground(Color.white); Panel p_color_btn = new Panel(new FlowLayout(FlowLayout.LEFT)); p_color_btn.setBackground(Color.white); p_color_btn.add(btn_color); p_color1.add(p_color_btn); p_color1.add(new Label("bright min")); p_color1.add(bright_min); p_color1.add(new Label("")); p_color1.add(new Label("bright max")); p_color1.add(bright_max); p.add(p_color1); Panel p_color2 = new Panel(new GridLayout(2,3)); p_color2.setBackground(Color.white); p_color2.add(new Label("")); p_color2.add(new Label("R' min")); p_color2.add(red_min); p_color2.add(new Label("")); p_color2.add(new Label("R' max")); p_color2.add(red_max); p.add(p_color2); Panel p_color3 = new Panel(new GridLayout(2,3)); p_color3.setBackground(Color.white); p_color3.add(new Label("")); p_color3.add(new Label("G' min")); p_color3.add(green_min); p_color3.add(new Label("")); p_color3.add(new Label("G' max")); p_color3.add(green_max); p.add(p_color3); Panel p_color4 = new Panel(new GridLayout(2,3)); p_color4.setBackground(Color.white); p_color4.add(new Label("")); p_color4.add(new Label("B' min")); p_color4.add(blue_min); p_color4.add(new Label("")); p_color4.add(new Label("B' max")); p_color4.add(blue_max); p.add(p_color4); Panel p_reset = new Panel(new FlowLayout(FlowLayout.LEFT)); p_reset.setBackground(Color.white); p_reset.add(btn_reset); p.add(p_reset); add("East",p); btn_reset.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { img_ = reset(); repaint(); getColor(img_, color, w, h); } }); btn_color.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { img_ = color(bright_min,bright_max, red_min,red_max, green_min,green_max, blue_min,blue_max, w,h); repaint(); getColor(img, color, w, h); } }); /* * <<<<< スライダーイベント処理登録 >>>>>> */ } public void paint(Graphics g) { g.drawImage(img_,0,0,this); } public Image reset() { return img; } public Image color(Scrollbar bright_min, Scrollbar bright_max, Scrollbar red_min, Scrollbar red_max, Scrollbar green_min, Scrollbar green_max, Scrollbar blue_min, Scrollbar blue_max, int w, // 画像の幅 int h // 画像の高さ ){ int tmp; int[] pix= new int[w*h]; double r_min,g_min,b_min,br_min; double r_max,g_max,b_max,br_max; double r,g,b,bright; r_min=red_min.getValue(); r_max=red_max.getValue(); g_min=green_min.getValue(); g_max=green_max.getValue(); b_min=blue_min.getValue(); b_max=blue_max.getValue(); br_min=bright_min.getValue(); br_max=bright_max.getValue(); for(int i=0;i<h;i++){ for(int j=0;j<w;j++){ bright= color[j+i*w][0]+ color[j+i*w][1]+ color[j+i*w][2]; r=(double)(1000*color[j+i*w][0])/bright; g=(double)(1000*color[j+i*w][1])/bright; b=(double)(1000*color[j+i*w][2])/bright; if(br_min > bright || br_max < bright || r_min > r || r_max < r || g_min > g || g_max < g || b_min > b || b_max < b){ for(int k=0;k<3;k++){ color[j+i*w][k]= 0; } } } } return makeImage(color, w , h); } // 色情報(0~255)をしまう配列 color[h*w][3] Image makeImage(int color[][], int w, // 画像の幅 int h // 画像の高さ ){ int[] pix = new int[w*h]; for(int i=0;i<h;i++){ for(int j=0;j<w;j++){ pix[j+i*w]=(255<<24)| (color[j+i*w][0]<<16)| (color[j+i*w][1]<<8)| (color[j+i*w][2]); } } return createImage(new MemoryImageSource(w,h,pix,0,w)); } // 画像から色情報を取り出す。 // 色情報(0~255)をしまう配列 color[h*w][3] void getColor(Image img_, // 元の画像 int color[][], int w, // 画像の幅 int h // 画像の高さ ) { int[] pix= new int[w*h]; PixelGrabber pg= new PixelGrabber(img_,0,0,w,h,pix,0,w); try{pg.grabPixels();}catch(Exception e){} for(int i=0;i<h;i++){ for(int j=0;j<w;j++){ color[j+i*w][0]= (pix[j+i*w] & 0xff0000)>>16; // 赤色 color[j+i*w][1]= (pix[j+i*w] & 0xff00)>>8; // 緑色 color[j+i*w][2]= pix[j+i*w] & 0xff; // 青色 } } } }