package tomojavalib.usbcamera;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;



import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.*;

import com.github.sarxos.webcam.Webcam;
import com.sun.xml.internal.bind.v2.schemagen.xmlschema.List;

import tomojavalib.p2cad.Frame;
import tomojavalib.util.Dir;
import tomojavalib.util.Jikoku;


/**
 * 定点撮影用のカメラアプリ
 * 最初に撮影した画像を現在のカメラ映像に重ねて表示し、同じ位置の画像を撮影できるようにします
 * @author tomo
 *2016/6/7作成開始
 *参考にしたページ
 *http://netbuffalo.doorblog.jp/archives/4528385.html
 *http://webcam-capture.sarxos.pl/
 */
public class TeitenCamera extends JFrame implements Runnable{
Webcam webcam = null;
private JPanel camerapanel = null;
private JButton b1 =null;
private JButton b2 =null;
Thread timer;
public BufferedImage dimg = null;
public String holder = "./motodata/" ;
public String dfilename = "ini.png";
//BufferedImage iimg =null;

 /**
  * main()
  * @param args
  */
 public static void main(String[] args) {
   TeitenCamera f = new TeitenCamera();
 }

/**
 * コンストラクタ
 */
public TeitenCamera(){
 //すべてのフォントを一括設定
 setUIFont(new javax.swing.plaf.FontUIResource("ＭＳ ゴシック", Font.PLAIN, 12));
 //閉じたらプログラムも終了
 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 //カメラを準備
 this.connectCamera();
 //最初のファイルを読み込む
 dimg = this.getInisyalData( holder + dfilename );
 //コンポーネントを配置する
 this.setComponents( this ); 
 //イベント設定
 this.setEvent();
 //可視化
 this.setVisible(true); 
 //タイマースタート
 timer = new Thread(this);
 timer.start();
}


private void setEvent(){
//ボタン1にイベントを設定(ファイル選択画面を表示）
this.b1.addMouseListener(
 new MouseAdapter(){public void mouseClicked(MouseEvent e){
 TeitenCamera.this.openMotoFileSelectFrame(); 
 } } );
//ボタン2にイベントを設定(ファイル選択画面を表示）
this.b2.addMouseListener(
new MouseAdapter(){public void mouseClicked(MouseEvent e){
  TeitenCamera.this.save(); 
} } );

return;
}


/**
 * 現在の画像を保存します
 */
private void save(){
String savedir = this.dfilename.replaceAll(".png", "");
savedir = savedir.replaceAll(".jpg", "");
Dir dir = new Dir();
String[] holders = dir.readDirs("./data");
boolean flug = false;
//既存のデータがあるか確認
for(int i=0;i<holders.length;i++){
 System.out.println( holders[i] );
 if( holders[i].equals(savedir) ){ flug = true; }
}
//無ければホルダー作成
if(flug==false){ dir.makeDir( "./data/" + savedir);}
//イメージ取得
BufferedImage image =webcam.getImage();
//ファイル保存
Jikoku j = new Jikoku();
String now = j.stringNow();
this.saveFaile("./data/" + savedir + "/" + savedir + now + ".png" , image);
return;
}


/**
 * 元画像選択Frameを開く
 */
private void openMotoFileSelectFrame(){
 //フレームを開く
 FrameFileSelect ffs = new FrameFileSelect( this , holder );
}


/**
 * 画像を読み込んでBufferedImageに入れて返す
 */
private BufferedImage getInisyalData( String filename ){
  BufferedImage image = null;  //webcam.getImage();
  try{
  image = ImageIO.read( new File( filename ));
  }catch(Exception e){System.out.println("元画像が読めませんでした");}
return image;
}




/**
 * USBカメラに接続する
 */
private void connectCamera(){
//USBカメラとの接続
 //webcam = Webcam.getDefault();
 java.util.List<Webcam> webcams = Webcam.getWebcams();
 try{
 webcam = webcams.get( 0 );
 }catch( Exception e){ System.out.println("USBカメラが接続されていません"); }
 if (webcam != null) {
  System.out.println("Webcam : " + webcam.getName());
  webcam.setViewSize(new Dimension(640, 480));
  webcam.open();
  /*
  BufferedImage image = webcam.getImage();
  try{
  ImageIO.write(image, "PNG", new File("c:\\test.png"));
  }catch(Exception e){}
  */
 } else {
  System.out.println("Failed: Webcam Not Found Error");
 }
}


private void saveFaile(String filename , BufferedImage image){
//BufferedImage image = webcam.getImage();
try{
ImageIO.write(image, "PNG", new File( filename ));
}catch(Exception e){}
}

/**
 * フレームにコンポーネントを配置する
 */
private void setComponents( JFrame fc ){
 fc.setTitle( "定点観測カメラ" );
 Container contentPane = fc.getContentPane();
 contentPane.setPreferredSize(new Dimension(800,600)); 
 fc.pack();
 camerapanel = new JPanel();
 camerapanel.setPreferredSize( new Dimension(640,480) );
 //camerapanel.setBackground(Color.RED);
 contentPane.add(camerapanel, BorderLayout.WEST);
 JPanel menupanel = new JPanel();
 menupanel.setPreferredSize( new Dimension(160,600) );
 menupanel.setBackground(Color.WHITE);
 b1 = new JButton("元画像選択");
 menupanel.add(b1);
 b2 = new JButton(" 撮影 ");
 menupanel.add(b2);
 contentPane.add(menupanel, BorderLayout.EAST);
}


/**
 * 元画像と現画像との合成をおこなう
 * ()
 * @return
 */
private BufferedImage getGouseiImg(BufferedImage img){
 BufferedImage iimg = img ;
 for(int i=0;i<iimg.getHeight();i=i+2){
  for(int ii=0;ii<iimg.getWidth();ii++){
  int drgb = dimg.getRGB(ii, i);

   iimg.setRGB(ii, i, dimg.getRGB(ii, i));
 }}
 return iimg;
}

/**
 * 元画像と現画像との合成をおこなう
 * (元画像を反転して合成)
 * @return
 */
private BufferedImage getGouseiImg2(BufferedImage img){
 BufferedImage iimg = img ;
 for(int i=0;i<iimg.getHeight();i++){
  for(int ii=0;ii<iimg.getWidth();ii++){
  int drgb = dimg.getRGB(ii, i);
  int irgb = iimg.getRGB(ii, i);
  int r = -(drgb & 0xff0000) + (irgb & 0xff0000) + 0xff0000;
  r= (int)(r/2.) & 0xff0000 ;
  int g = -(drgb & 0x00ff00) + (irgb & 0x00ff00) +0xff00;
  g= (int)(g/2.) & 0x00ff00 ;  
  int b = -(drgb & 0x0000ff) + (irgb & 0x0000ff) +0xff;
  b= (int)(b/2.) & 0x0000ff ; 
  int rgb = r + g + b ;
  iimg.setRGB(ii, i, rgb);
 }}
 return iimg;
}



public void paint(Graphics g){ super.paint(g);}


//実行関数
public void run()
{
//無限ループ
 do{
  // 100/1000秒休憩
 try{ timer.sleep(100);}catch(InterruptedException e){}
 BufferedImage image =getGouseiImg( webcam.getImage() );
 Graphics gg = camerapanel.getGraphics();
 gg.drawImage(image,0,0, camerapanel);
  //this.repaint();
 }while(true);
}

/**
 * フレームのすべてのフォントを一括変更する
 * @param f
 */
private static void setUIFont (javax.swing.plaf.FontUIResource f){
 java.util.Enumeration keys = UIManager.getDefaults().keys();
 while (keys.hasMoreElements()) {
  Object key = keys.nextElement();
  Object value = UIManager.get (key);
  if (value instanceof javax.swing.plaf.FontUIResource)
  UIManager.put (key, f);
 }
}

}//endofcalss
