import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.event.MouseInputAdapter;

public class SeciliAlanKeydet {

    private BufferedImage resim;
    private Rectangle seciliAlan;
    private Point seciliAlanBaslangic;

    public SeciliAlanKeydet() throws IOException {
    	
        resim = ImageIO.read(new File("src/images/sehir.jpeg"));
        
        seciliAlan = new Rectangle(0, 0, 400, 225);
        seciliAlanBaslangic = new Point(0, 0);
        
        JPanel panel = new JPanel() {
            
            public void paintComponent(Graphics grafik) {
            	grafik.drawImage(resim, 0, 0, null);
            	grafik.drawRect(seciliAlan.x, seciliAlan.y, seciliAlan.width, seciliAlan.height);
            }

            public Dimension getPreferredSize() {  // Panelin ölçüsü resim ölçüsüne ayarlanir...
                return new Dimension(resim.getWidth(), resim.getHeight());
            }
        };

        
        panel.addMouseListener(new MouseInputAdapter() {
            
            public void mousePressed(MouseEvent event) {
                
            	seciliAlanBaslangic = event.getPoint();
                seciliAlan.setLocation(seciliAlanBaslangic);
                
            }

            
            public void mouseReleased(MouseEvent event) {
            	
                kaydet();
                kaydetOlcu();
            
            }
        });

        panel.addMouseMotionListener(new MouseInputAdapter() {
            
            public void mouseDragged(MouseEvent e) {
                
            	int x = Math.min(e.getX(), seciliAlanBaslangic.x);
                int y = Math.min(e.getY(), seciliAlanBaslangic.y);
                int width = Math.abs(e.getX() - seciliAlanBaslangic.x);
                int height = Math.abs(e.getY() - seciliAlanBaslangic.y);
                
                seciliAlan.setBounds(x, y, width, height);
                panel.repaint();
                
            }
        });
        
        JFrame frame = new JFrame("Seçili Resim Alanini Kaydet | Java Blackboard [109]");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    // verilen olcude kaydeder --->  730 x 650 px
    // Ölçü --->  730 x 650 px
    private void kaydetOlcu() {  
    	
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-d HH-mm-ss");
		Date date = new Date();
		
		int genislik = 730;
		int yukseklik = 650;
    	
    	BufferedImage secilenAlan = resim.getSubimage(seciliAlan.x, seciliAlan.y, seciliAlan.width, seciliAlan.height);
   		
    	BufferedImage scaledImage = new BufferedImage(genislik, yukseklik, secilenAlan.getType());
    	
    	Graphics2D graphics = scaledImage.createGraphics();
    	graphics.drawImage(secilenAlan, 0, 0, genislik, yukseklik, null);
    	graphics.dispose();

    	File kaydedilecekDosya = new File("src/images/secilenAlan-"+dateFormat.format(date)+".jpg");
            	
    	try {
    	    ImageIO.write(scaledImage, "jpg", kaydedilecekDosya);
    	    System.out.println("Dosya kaydedildi: " + kaydedilecekDosya.getAbsolutePath());
    	} catch (IOException e) {
    	    e.printStackTrace();
    	}
    }
    
    // Mouse ile seçilen alani kaydeder... 
    // Mouse ile belirlenen Orijinal olçüde....
    private void kaydet() { 
    	
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-d HH-mm-ss");
		Date date = new Date();

    	
    	BufferedImage secilenAlan = resim.getSubimage(seciliAlan.x, seciliAlan.y, seciliAlan.width, seciliAlan.height);

    	Graphics2D graphics = secilenAlan.createGraphics();
    	graphics.drawImage(secilenAlan, 0, 0, seciliAlan.width, seciliAlan.height, null);
    	graphics.dispose();
    	
    	File kaydedilecekDosya = new File("src/images/secilenAlan_"+dateFormat.format(date)+".jpg");
            	
        try {
        
        	ImageIO.write(secilenAlan, "jpg", kaydedilecekDosya);
            System.out.println("Dosya kaydedildi: " + kaydedilecekDosya.getAbsolutePath());
        
        } catch (IOException e) {
        
        	e.printStackTrace();
        
        }
    }

    public static void main(String[] args) {
       
    	SwingUtilities.invokeLater(() -> {
    	    
    		try {
				
    			new SeciliAlanKeydet();
			
    		} catch (IOException e) {

				e.printStackTrace();
			}
    		
        });

    }
}

