ayuda con imagenes
buenas noches, tengo e siguiente problema, estoy realizando una aplicacion que le permite al usuario seleccionar una imagen y de la misma sacar todo su codigo rgb, lo que me esta fallando ahora son 3 cosas, una es q al crear el archivo me dice que este no puede ser encontrado, la segunda es que a la hora de recorrer la imagen (estoy usando un for dentro de for) parece que entra en un ciclo infinito, o al menos tarda demasiado para procesar y la otra es que no tengo mucha idea de como hacer que el usuario pueda seleccionar la imagen que desee, hasta ahora he trabajado con una imagen unica, ¿alguna sugerencia?
- Inicie sesión o regístrese para enviar comentarios
Lo de la imagen esta fuera
Lo de la imagen esta fuera de mis conocimientos actuales, pero lo de hacer que el usuario escoja una imagen es otra cosa *--*
Lo que necesitas es usar la clase
JFileChooser
yFile
. Te dejo un ejemplo que hice hace unos dias para un miembro de la comunidad (no tengo tiempo de hacer uno).* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package test;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FilenameFilter;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
/**
*
* @author Kalt
*/
public class Test {
private static File directorioImagenes[] = null;
private static File archivoEscogido = null;
private JFrame frame = null;
private JButton b = null;
private final static JFileChooser jfc = new JFileChooser();
public Test() {
frame = new JFrame("Test");
frame.getContentPane().setLayout(new BorderLayout());
jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
b = new JButton("Abrir");
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int var = jfc.showDialog(frame, "Escoje la imagen");
if (var == JFileChooser.APPROVE_OPTION) {
archivoEscogido = jfc.getSelectedFile();
listarImagenes();
}
}
});
frame.add(b);
frame.pack();
frame.setVisible(true);
}
private void listarImagenes() {
capturarImagenes();
if (directorioImagenes != null) {
int length = directorioImagenes.length;
System.out.println("Contenido del directorio:");
for (int i = 0; i < length; i++) {
System.out.println(directorioImagenes[i]);
}
}
}
private void capturarImagenes() {
if (archivoEscogido != null) {
System.out.println("El archivo elegido es: "+archivoEscogido);
File contenidoDelDirectorio = archivoEscogido.getParentFile();
System.out.println("El directorio padre es: "+contenidoDelDirectorio);
directorioImagenes = contenidoDelDirectorio.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
if (name.toLowerCase().endsWith(".jpg")
|| name.toLowerCase().endsWith(".png")
|| name.toLowerCase().endsWith(".jpeg")
|| name.toLowerCase().endsWith(".gif")) {
return true;
} else {
return false;
}
}
});
}
}
public static void main(String args[]) {
new Test();
}
}
Gracias
gracias, voy a proarlo ahora y te cuento como m fue
si me funciono XD ahora voy
si me funciono XD ahora voy con lo de poder escribir en el archivo y que recorra bien la imagen
Yo no se sobre eso pero
Yo no se sobre eso pero postea el código que llevas o la forma en que lo estas intentando y a ver si te puedo ayudar :)
codigo
aqui esta lo que llevo... perdona el desorden jajajaja
import java.awt.image.BufferedImage;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import javax.imageio.*;
import javax.swing.*;
public class Imagen {
static JFileChooser abrirImg = new JFileChooser();
static BufferedImage buffImg;
static String titulo="";
private static String imgTxt="";
static File img;
public static void abrir(){
try {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
int var = abrirImg.showDialog(frame, "Escoje la imagen");
if (var == JFileChooser.APPROVE_OPTION) {
img = abrirImg.getSelectedFile();}
String tit=img.getName();
int d=4;
if(tit.toLowerCase().endsWith(".jepg")){d=5;}
for(int i=0;i<tit.length()-d;i++){//-4 por el .1J2P3G4
titulo=titulo+tit.charAt(i);}
buffImg = ImageIO.read(img.toURL());}
catch (Exception e) {e.printStackTrace();}
}
private static void imagenTexto(){
try{
File archivo = new File("C:\\"+titulo+".txt");
BufferedWriter escritor = new BufferedWriter(new FileWriter(archivo));
for(int a=1;a<=buffImg.getWidth();a++){
for(int b=1;b<=buffImg.getHeight();b++){
escritor.write(buffImg.getRGB(a,b)+"\n");
System.out.println(a+" "+b);}
escritor.write("y+\n");
System.out.println("YA");}
escritor.close();
JOptionPane.showMessageDialog(null, "Su archivo fue creado exitosmente en la direccion C bajo el nombre de "+titulo+"\n por favor revise su disco duro");
}
catch(Exception e){System.out.println(e);}
}
public static void main(String[] args) {
abrir();
imagenTexto();
System.out.println(imgTxt);
}}
lo otro que note tras una prueba es que es mortalmente lento... una prueba con una img de 500x300 tardo como 10 minutos T_T
ademas de que sigo sin poder abrir el doc que creo XD
Ya entendí que es lo que
Ya entendí que es lo que quieres hacer, es mas, ya lo hice. Te dejo el código. No esta comentado. Depende de ti entender el código.
En general lo estabas haciendo bien, tu forma de recorrer el buffer de la imagen era el correcto (casi). Lo que no era correcto era la forma del dato que guardabas. Porque lo que regresa el método
getRGB(int x, int y)
es un pixel(representado por un int), no un color o colores. Para mostrar los colores que componen ese pixel debemos convertir ese numero(aritmética binaria).En el código que te voy a dejar el método convertirRGB(int pixel) se encarga de realizar la conversión y de escribir en el buffer.
Analiza y estudia el código, entiéndelo y por ultimo, modificalo a tu antojo. Si tienes dudas pregunta y en lo que pueda te ayudo. Saludos ;)
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFileChooser;
/**
*
* @author kalt
*/
public class Imagen {
private static BufferedImage buffImg;
private static BufferedWriter bwriter;
private static JFileChooser jfc = new JFileChooser();
public static void main(String args[]) {
File file = abrirImagen();
crearBuffers(file);
recorrerImagen();
}
private static File abrirImagen() {
jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
int eleccion = jfc.showDialog(null, "Escoje la imagen");
File file;
if(eleccion == JFileChooser.APPROVE_OPTION) {
file = jfc.getSelectedFile();
if(filtrarArchivo(file)) {
return file;
}
}
file = null;
return file;
}
private static boolean filtrarArchivo(File file) {
if(file.toString().toLowerCase().endsWith(".jpg")) {
return true;
}
return false;
}
private static void crearBuffers(File file) {
if(file != null) {
try {
buffImg = ImageIO.read(file);
bwriter = new BufferedWriter(new FileWriter(file.getPath() +"texto.txt"));
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
private static void recorrerImagen() {
if((buffImg != null) && (bwriter != null)) {
int width = buffImg.getWidth();
int heigth = buffImg.getHeight();
try {
bwriter.write("Alto:"+ heigth+" Ancho:"+width+"\n");
for(int i = 0; i < width; i++) {
for(int j = 0; j < heigth; j++) {
convertirRGB(buffImg.getRGB(i, j));
}
}
bwriter.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
private static void convertirRGB(int pixel) {
int alpha = (pixel >> 24) & 0xff;
int red = (pixel >> 16) & 0xff;
int green = (pixel >> 8) & 0xff;
int blue = (pixel) & 0xff;
try {
bwriter.write("Alfa:"+ alpha+" Rojo:"+ red+" Verde:"+ green+" Azul:"+blue+"\n");
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
Muchas Gracias
muchas gracias Jose si me funciono XD solo tengo que arreglar algo en el for que tranca el programa y quedo listo, cuando termine te cuento como me fue.
Pega el Stacktrace
El for no tiene ningún problema. Yo probé el programa con varias imágenes, grandes y pequeñas. Eso si, como metas una imagen grande el archivo de texto puede llegar a pesar mas de 100 Mb.
Pero si marca error o algo coloca el mensaje aquí.