commit fa8fe0d2b6ad0d3626865d13ef6de96e6b50d931 Author: Maxch26 Date: Wed Feb 28 08:10:59 2024 -0600 Versión Final AsciiArt diff --git a/ImageToAscii/src/imagetoascii/ImageToAscii.java b/ImageToAscii/src/imagetoascii/ImageToAscii.java new file mode 100644 index 0000000..24f5046 --- /dev/null +++ b/ImageToAscii/src/imagetoascii/ImageToAscii.java @@ -0,0 +1,257 @@ + +package imagetoascii; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Container; +import java.awt.Font; +import java.awt.GridLayout; +import java.awt.image.BufferedImage; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import javax.imageio.ImageIO; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.JTextField; +import javax.swing.text.AttributeSet; +import javax.swing.text.SimpleAttributeSet; +import javax.swing.text.StyleConstants; +import javax.swing.filechooser.FileNameExtensionFilter; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import javax.swing.SwingUtilities; + + +public class ImageToAscii extends JFrame { + private JTextArea asciiTextArea; + + public ImageToAscii() { + setTitle("Image to ASCII"); + setSize(800, 600); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + // Obtener el contentPane y establecer un BorderLayout con un color de fondo + Container contentPane = getContentPane(); + contentPane.setLayout(new BorderLayout()); + contentPane.setBackground(Color.LIGHT_GRAY); + + // Crear el panel para los botones con un fondo verde claro + JPanel buttonPanel = new JPanel(); + buttonPanel.setBackground(new Color(200, 120, 255)); + + // Crear los botones con colores personalizados + JButton selectImageButton = createStyledButton("Seleccionar Imagen", Color.BLACK); + JButton clearButton = createStyledButton("Borrar", Color.RED); + JButton convertToTxtButton = createStyledButton("Convertir a TXT", Color.BLUE); + + // Agregar los botones al panel de botones + buttonPanel.add(selectImageButton); + buttonPanel.add(clearButton); + buttonPanel.add(convertToTxtButton); + + // Agregar el panel de botones en la región NORTH del BorderLayout + contentPane.add(buttonPanel, BorderLayout.NORTH); + + // Crear el área de texto para mostrar el arte ASCII con un fondo blanco + asciiTextArea = new JTextArea(); + asciiTextArea.setEditable(false); + asciiTextArea.setFont(new Font("Monospaced", Font.PLAIN, 12)); + asciiTextArea.setBackground(Color.WHITE); + + // Crear un JScrollPane para permitir el desplazamiento + JScrollPane scrollPane = new JScrollPane(asciiTextArea); + scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); + + // Agregar el JScrollPane en la región CENTER del BorderLayout + contentPane.add(scrollPane, BorderLayout.CENTER); + + setVisible(true); + } + + private void handleButtonClick(String buttonText) { + // Implementa el manejo de clics de botón según el texto del botón + switch (buttonText) { + case "Seleccionar Imagen": + showImageDialog(); + break; + case "Borrar": + clearAsciiTextArea(); + break; + case "Convertir a TXT": + saveAsTxt(); + break; + // Agrega más casos según sea necesario + } +} + + private JButton createStyledButton(String text, Color color) { + JButton button = new JButton(text); + button.setBackground(color); + button.setForeground(Color.WHITE); + button.addActionListener(e -> handleButtonClick(text)); // Reemplaza handleButtonClick con el manejo apropiado + return button; +} + + private void showImageDialog() { + JDialog dialog = new JDialog(this, "Configurar Dimensiones de la Imagen", true); + dialog.setLayout(new GridLayout(3, 2)); + + JLabel widthLabel = new JLabel("Ancho:"); + JTextField widthField = new JTextField(); + JLabel heightLabel = new JLabel("Alto:"); + JTextField heightField = new JTextField(); + + JButton okButton = new JButton("Aceptar"); + okButton.addActionListener(e -> { + int width = Integer.parseInt(widthField.getText()); + int height = Integer.parseInt(heightField.getText()); + dialog.dispose(); + selectImageAndConvert(width, height); + }); + + JButton cancelButton = new JButton("Cancelar"); + cancelButton.addActionListener(e -> dialog.dispose()); + + dialog.add(widthLabel); + dialog.add(widthField); + dialog.add(heightLabel); + dialog.add(heightField); + dialog.add(okButton); + dialog.add(cancelButton); + + dialog.pack(); + dialog.setLocationRelativeTo(this); + dialog.setVisible(true); + } + + private void selectImageAndConvert(int targetWidth, int targetHeight) { + // Crear un JFileChooser + JFileChooser fileChooser = new JFileChooser(); + fileChooser.setDialogTitle("Seleccione una imagen"); + + // Filtro para mostrar solo archivos de imagen + FileNameExtensionFilter imageFilter = new FileNameExtensionFilter("Archivos de imagen", "jpg", "png", "jpeg", "gif"); + fileChooser.setFileFilter(imageFilter); + + // Mostrar el diálogo de selección de archivo + int result = fileChooser.showOpenDialog(null); + + // Verificar si se seleccionó un archivo + if (result == JFileChooser.APPROVE_OPTION) { + // Obtener la ruta de la imagen seleccionada + String imagePath = fileChooser.getSelectedFile().getAbsolutePath(); + + try { + // Cargar la imagen + BufferedImage originalImage = ImageIO.read(new File(imagePath)); + + // Escalar la imagen a las dimensiones especificadas + BufferedImage scaledImage = scaleImage(originalImage, targetWidth, targetHeight); + + // Obtener las dimensiones de la imagen escalada + int width = scaledImage.getWidth(); + int height = scaledImage.getHeight(); + + // Crear un StringBuilder para construir el arte ASCII + StringBuilder asciiArt = new StringBuilder(); + + // Iterar sobre cada píxel y convertir a arte ASCII + for (int y = 0; y < height; y += 2) { + for (int x = 0; x < width; x++) { + // Obtener el color del píxel + Color color = new Color(scaledImage.getRGB(x, y)); + + // Calcular el nivel de gris (promedio de los componentes RGB) + int gray = (color.getRed() + color.getGreen() + color.getBlue()) / 3; + + // Convertir el nivel de gris a un carácter ASCII + char asciiChar = getAsciiChar(gray); + + // Agregar el carácter al StringBuilder + asciiArt.append(asciiChar); + } + // Agregar un salto de línea al final de cada fila + asciiArt.append("\n"); + } + + // Mostrar el arte ASCII en el JTextArea + asciiTextArea.setText(asciiArt.toString()); + + } catch (IOException e) { + e.printStackTrace(); + } + } +} + + private void clearAsciiTextArea() { + // Borrar el contenido del JTextArea + asciiTextArea.setText(""); + } + + private void saveAsTxt() { + // Crear un JFileChooser para seleccionar la ubicación de guardado + JFileChooser fileChooser = new JFileChooser(); + fileChooser.setDialogTitle("Guardar como archivo de texto"); + fileChooser.setSelectedFile(new File("ascii_art.txt")); + + // Mostrar el diálogo de guardado + int result = fileChooser.showSaveDialog(null); + + // Verificar si se seleccionó una ubicación de guardado + if (result == JFileChooser.APPROVE_OPTION) { + // Obtener el archivo seleccionado + File outputFile = fileChooser.getSelectedFile(); + + try (BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile))) { + // Guardar el contenido del JTextArea en el archivo + writer.write(asciiTextArea.getText()); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + private BufferedImage scaleImage(BufferedImage originalImage, int targetWidth, int targetHeight) { + BufferedImage scaledImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB); + java.awt.Graphics2D g = scaledImage.createGraphics(); + g.drawImage(originalImage, 0, 0, targetWidth, targetHeight, null); + g.dispose(); + return scaledImage; + } + + private void appendColoredText(String text, Color color) { + SimpleAttributeSet attrs = new SimpleAttributeSet(); + StyleConstants.setForeground(attrs, color); + + SwingUtilities.invokeLater(() -> { + Document doc = asciiTextArea.getDocument(); + try { + doc.insertString(doc.getLength(), text, attrs); + } catch (BadLocationException e) { + e.printStackTrace(); + } + }); +} + + private void appendColoredChar(char character, Color color) { + appendColoredText(String.valueOf(character), color); + } + + private static char getAsciiChar(int gray) { + // Ajusta estos valores según tu preferencia + char[] asciiChars = {'@', '#', '8', '&', 'o', ':', '*', '.', ' '}; + int index = gray * (asciiChars.length - 1) / 255; + return asciiChars[index]; + } + + public static void main(String[] args) { + new ImageToAscii(); +} +}