📄 EnBoyOranliSeciliAlan.java .java dosyası

⬇️ İndir
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; 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.Arrays; import java.util.Date; import javax.imageio.ImageIO; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.event.MouseInputAdapter; import javax.swing.text.AbstractDocument; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.DocumentFilter; public class EnBoyOranliSeciliAlan { public static JPanel anaPanel = new JPanel(); public static double oran; public static double oranX; public static double oranY; public static JTextField fieldX; public static JTextField fieldY; private static BufferedImage resim; private static Rectangle seciliAlan; private static Point seciliAlanBaslangic; // Bu site Nic Jackson anısına ücretsiz fotoğraf sunmaktadır. // https://littlevisuals.co/ public EnBoyOranliSeciliAlan() throws IOException { resim = ImageIO.read(new File("src/images/geyik.jpg")); seciliAlan = new Rectangle(0, 0, 160, 90); // 16:9 oranli ilk alan seciliAlanBaslangic = new Point(0, 0); JFrame frame = new JFrame("Belirtilen En-Boy Oran ile Seçili Resim Alanını Kaydet | Java Blackboard [144]"); frame.setLayout(null); anaPanel.setLayout(null); anaPanel.setBackground(new Color(211, 211, 211)); anaPanel.setBounds(50, 50, 1400, 800); anaPanel.add(oranPaneli("Geyik")); anaPanel.add(resimPaneli()); frame.add(anaPanel); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(1500, 900); frame.setResizable(false); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static JPanel oranPaneli(String dosyaIsmi) throws IOException { JPanel panel = new JPanel(); panel.setLayout(null); panel.setBackground(new Color(125, 125, 125)); panel.setBounds(0, 0, 280, 50); String[] resimDosyalari = {"Geyik", "Vana", "Kapı", "The Pines", "Günbatımı"}; String[] siraliResimDosyalari = resimDosyalari.clone(); // Dizinin kopyasını oluşturuyoruz. Arrays.sort(siraliResimDosyalari); // Diziyi sıralandı. // Bu şekilde, siraliResimDosyalari dizisi Arrays.sort() metodu kullanılarak // alfabetik olarak sıralanır ve bu sıralanmış dizi // JComboBox içerisinde kullanılabilir. // Ayrıca, clone() metodu ile orijinal dizinin değişmeden kalmasını sağlamış oluruz. JComboBox<String> comboResim = new JComboBox<>(siraliResimDosyalari); comboResim.setSelectedItem(dosyaIsmi); comboResim.setBounds(20, 10, 100, 30); comboResim.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String secilenResimAdi = (String) comboResim.getSelectedItem(); if (secilenResimAdi != null) { String dosyaAdi = ""; switch (secilenResimAdi) { case "Geyik": dosyaAdi = "geyik.jpg"; break; case "Vana": dosyaAdi = "vana.jpeg"; break; case "Kapı": dosyaAdi = "kapi.jpg"; break; case "The Pines": dosyaAdi = "the_pines.jpg"; break; case "Günbatımı": dosyaAdi = "gunbatimi.jpg"; break; default: // Seçili öğe listede yoksa bir default durumu belirtilebilir. // Ancak bizde öyle bi durum yok simdilik :) break; } try { resim = ImageIO.read(new File("src/images/" + dosyaAdi)); // Resim JComboBox'tan her değiştiğinde anaPanel'in yenilenmesi gerekiyor. anaPanel.removeAll(); anaPanel.add(oranPaneli(secilenResimAdi)); anaPanel.add(resimPaneli()); anaPanel.revalidate(); anaPanel.repaint(); } catch (IOException ex) { ex.printStackTrace(); } } } }); fieldX = new JTextField("16"); fieldX.setBounds(140, 10, 50, 30); // JTextField içine sadece rakam girilsin diye düzenleme yapiyoruz. ((AbstractDocument) fieldX.getDocument()).setDocumentFilter(new DocumentFilter() { @Override public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException { // text.matches("\\d*") ifadesi, // yalnızca rakamları kabul eden bir regex ifadesidir. if (text.matches("\\d*")) { super.replace(fb, offset, length, text, attrs); } } }); fieldY = new JTextField("9"); fieldY.setBounds(210, 10, 50, 30); ((AbstractDocument) fieldY.getDocument()).setDocumentFilter(new DocumentFilter() { @Override public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException { if (text.matches("\\d*")) { super.replace(fb, offset, length, text, attrs); } } }); panel.add(comboResim); panel.add(fieldX); panel.add(fieldY); return panel; } public static JPanel resimPaneli() { JPanel resimPanel = new JPanel() { public void paintComponent(Graphics grafik) { grafik.drawImage(resim, 0, 0, null); // resmi orijinal haliyle gostermek için. // grafik.drawImage(resim, 0, 0, 100, 500, null); // resmi 100x500 olarak yeniden boyutlandimrak için. grafik.drawRect(seciliAlan.x, seciliAlan.y, seciliAlan.width, seciliAlan.height); } }; resimPanel.addMouseListener(new MouseInputAdapter() { public void mousePressed(MouseEvent event) { seciliAlanBaslangic = event.getPoint(); seciliAlan.setLocation(seciliAlanBaslangic); } public void mouseReleased(MouseEvent event) { kaydet(); kaydetOran(); } }); resimPanel.addMouseMotionListener(new MouseInputAdapter() { @Override public void mouseDragged(MouseEvent e) { oranX = Double.parseDouble(fieldX.getText()); oranY = Double.parseDouble(fieldY.getText()); oran = oranX / oranY; int x = seciliAlanBaslangic.x; int y = seciliAlanBaslangic.y; int width = e.getX() - seciliAlanBaslangic.x; int height = e.getY() - seciliAlanBaslangic.y; // Sınırları aşmamak için kontroller if (x + width > resim.getWidth()) { width = resim.getWidth() - x; height = (int) (width / oran); } if (y + height > resim.getHeight()) { height = resim.getHeight() - y; width = (int) (height * oran); } // Oran kontrolleri if (Math.abs(height) * oran <= Math.abs(width)) { width = (int) (Math.signum(width) * Math.abs(height) * oran); } else { height = (int) (Math.signum(height) * Math.abs(width) / oran); } seciliAlan.setBounds(x, y, width, height); resimPanel.repaint(); } }); resimPanel.setBounds(0, 50, 1166, 768); return resimPanel; } // En-Boy Oranina göre seçilen alani // 1024 genisligie göre kaydeden metod ---> En-Boy ORAN 16:9 ----> ÖLÇÜ 1024×... private static void kaydetOran() { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-d HH-mm-ss"); Date date = new Date(); int genislik = 1024; int yukseklik = (int) ((1024*oranY)/oranX); 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 static 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 EnBoyOranliSeciliAlan(); } catch (IOException e) { e.printStackTrace(); } }); } }