Java - .toByteArray(). Posible solucion??

 
Vista:

.toByteArray(). Posible solucion??

Publicado por lilu (112 intervenciones) el 30/05/2006 15:15:26
Hola a todos, Hola Juan, Hola Chui, como veo que tambien estas aqui te o mejor dicho les mando mi pregunta respecto a lo de ayer, es decir, .toByteArray()....

Como le decia a Chui, en ByteArrayOutputStream si se guarda lo que se tiene que guardar y ya lo he comprovado 500 mil veces, todo eso esta bien hasta que se termina el while, el rollo esta en guardar lo que contiene ByteArrayOutputStream en un arreglito aparte, a mi profesor se le ocurrio algo ayer, pero es un "polo", pero que mas!!...:

for(contador = 0; contador < cantidadBytes; contador++)
{
String num = " ";
while (bytes.toString().charAt(contador)!=13)
num = bytes.toString().charAt(contador);

losBytes[contador] = Integer.parseInt(num);
}

Me da problema de tipos incompatibles y el rollo es que lo que le tengo que pasar a opengl es un arreglo de bytes, ni mas ni menos!!.....

Que me dicen??....

Cuidense!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:.toByteArray(). Posible solucion??

Publicado por Juan (131 intervenciones) el 30/05/2006 15:42:11
losBytes[contador] = (byte) Integer.parseInt(num); hacerlo asi te da error.

Lo otro que puedes hacer es una mascara con 0x000000FF con el Integer.parseInt() y despues castearlo a byte. Sino te cuadra asi, puedes asignarlo a una variable entera, y hacerle luego el casteo a la variable, pero asi deberia servir
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:.toByteArray(). Posible solucion??

Publicado por lilu (112 intervenciones) el 30/05/2006 16:49:28
Ki ubo Juan!!.... estoy trabajando "losBytes" como int, es decir:

int losBytes[ ]...

Es que pense lo que me dijiste, si yo convierto ese entero (Integer.parseInt(num)) a byte entonces el 203 no me lo guardaria como 203, porque se pasaria del rango, verdad!??..

Se me ocurrio que losBytes fuera de tipo char, ya que char son 2 bytes, en cambio un int son 4 enormes bytes, pero como los obtendria de ByteArrayOutputStream??

Me he matado hasta ahora con el tipo de dato byte porque pensaba que a opengl le tenia que pasar a juro (tipo de dato) byte y no es asi, le puedo pasar lo que yo quiera... Lo malo del tipo de dato byte es el rango... ;-(
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:.toByteArray(). Posible solucion??

Publicado por Juan (131 intervenciones) el 30/05/2006 17:42:18
Verga....... de pana que me tiene lelo tu caso. Yo cuando trabaje con Open GL fue con Visual C y eso fue verdaderamente facil. No conozco las posibilidades graficas de Java.

Bueno lo primero que te podria decir en que en vez de Int porque no la haces de short. No creo que ningun valor del archivo se pase del rango del tipo de dato. Pero la pregunta que me surge es el 203 sale como resultado del ByteArrayOutputStream o son propios del archivo? porque el 203 no es un byte por ningun lado.

en lo que este a mi alcance tratare de ayudarte

Juan
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:.toByteArray(). Posible solucion??

Publicado por lilu (112 intervenciones) el 30/05/2006 18:36:38
Jajajaja... eres Maracucho?... tienes que serlo a juro!!...porque ese "Verga", te salio de muy dentro!!...jajaja...

No!!...el 203 viene del archivo y lo guardo en ByteArrayOutputStream..

Uppss!!.. no deberia guardarlo en "ByteArrayOutputStream", a eso te refieres, verdad?

Si a eso te refieres, entonces donde guardaria los datos de mi archivo. Si no lo guardo en un "ByteArrayOutputStream", entonces donde??

NOTA:

JUAN: "en lo que este a mi alcance tratare de ayudarte"
LILU: Lo se!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:.toByteArray(). Posible solucion??

Publicado por Juan (131 intervenciones) el 30/05/2006 18:50:27
Uhmmmmmm nose.... es que lo no veo es como le pasas esa informacion al Open GL. Si me explicas eso, puedo pensar en ver que se me ocurre.
Lo que mas se me ocurre es que lo podrias guardar en un arreglo normal y usar el metodo write para pasarlo a uno de los objetos OutputStream que definan la interfaz. Nose cuan portable sea eso en cuanto a rapidez.
Y por otro lado no soy maracucho jeejeje soy de ccs y siempre he vivido aqui....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:.toByteArray(). Posible solucion??

Publicado por lilu (112 intervenciones) el 30/05/2006 20:58:44
Bueno, te explico mejor..

Estoy trabajando con cliente/servidor. El cliente le pide un archivo al servidor y el servidor se lo pasa al cliente. Que contiene ese archivo?, ese archivo contiene los datos de una imagen .png, es decir, la información de los componentes de cada píxel de color (RGB).

De donde saque ese archivo?, que programa utilice para crear ese archivo con los datos de la imagen?, pues este:

public class ObtenerDatos implements ImageObserver
{
public static void main(String[] args) throws Exception
{
ColorModel color;
int r, g, b, tam, x, y;

File textura = new File("cuadro_64x64.png");

if(!textura.exists()) {
System.err.println("Foto no encontrada");
System.exit(1);
}
final BufferedImage bi = ImageIO.read(textura);
final BufferedImage bfi = new BufferedImage(bi.getWidth(),bi.getHeight(),BufferedImage.TYPE_INT_RGB);
Graphics2D big = bfi.createGraphics();
big.drawImage(bi, 0, 0, new ObtenerDatos());

int ancho = bi.getWidth();
int alto = bi.getHeight();
int cant=0;

try{
FileOutputStream fichero = new FileOutputStream("c:/pruebita.dat ");
PrintWriter pw = new PrintWriter(fichero);

color = bfi.getColorModel();
for(x=0; x<ancho; x++)
{
for(y=0; y<alto; y++){
r = color.getRed(bfi.getRGB(x,y));
g = color.getGreen(bfi.getRGB(x,y));
b = color.getBlue(bfi.getRGB(x,y));

pw.println(r);
pw.println(g);
pw.println(b);
cant++;
}
}
pw.close();
}catch(Exception e)
{e.printStackTrace();}
}
public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height)
{return false;}
}

Fijate que lo que utilice aquí para guardar los componentes de cada color fue “println()”, aun tengo dudas al respecto…pero bueno!!..continuo.

OK, volviendo a lo otro!!...
Una ves que el servidor detecta que el cliente le pide un archivo, el servidor lo busca y se lo pasa. Donde guarda el cliente esa información?, Resp.: en “ByteArrayOutputStream bytes”, aquí se va copiando lo que va recibiendo del servidor con esto: bytes.write(….). después que el servidor termina de enviar los mensajes y ya todo esta copiado en el “ByteArrayOutputStream bytes” es cuando necesito sacar de alli la información para pasarcela a opengl. Porque necesito sacarla de alli?.. Resp.: Porque a opengl requiere que se le pase otro tipo de dato y no un “ByteArrayOutputStream”,

Que tipo de dato requiere opengl?,
Resp.:
public void glTexImage2D(int target,
int level,
int internalFormat,
int width,
int height,
int border,
int format,
int type,
Buffer pixels)

El ultimo parámetro es para mi lo mas deseado hasta ahora, esto es lo que estoy buscando: “Buffer pixels” o podria ser un arreglo tambien (digo yo!!), por eso estoy trabajando con arreglo porque no se trabajar con Bufer.

“Buffer pixels” ES LO QUE ESTOY BUSCANDO sacar de ByteArrayOutputStream (contiene los datos del archivo, es decir, la información de los píxeles, supuestamente!!)..

Te envio el codigo para que lo veas mejor: (Este es el cliente)

try
{
// Se abre el socket.
Socket socket = new Socket(servidor, puerto);

// Se envía un mensaje de petición de fichero.
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
MensajeDameFichero mensaje = new MensajeDameFichero();
mensaje.nombreFichero = fichero;
oos.writeObject(mensaje);

// Se crea un arreglo de bytes para empezar a copiar lo que se reciba.
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
// Se crea un ObjectInputStream del socket para leer los mensajes que contienen el fichero.
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());

MensajeTomaFichero mensajeRecibido;
int contador;
Object mensajeAux;

do
{
// Se lee el mensaje en una variable auxiliar
mensajeAux = ois.readObject();

// Si es del tipo esperado, se trata
if (mensajeAux instanceof MensajeTomaFichero)
{
mensajeRecibido = (MensajeTomaFichero) mensajeAux;
System.out.print(new String(mensajeRecibido.contenidoFichero, 0,mensajeRecibido.bytesValidos));//EL ARCHIVO_COPIA
bytes.write(mensajeRecibido.contenidoFichero, 0,mensajeRecibido.bytesValidos);
} else
{
// Si no es del tipo esperado, se marca error y se termina el bucle
System.err.println("Mensaje no esperado "+ mensajeAux.getClass().getName());
break;
}
} while (!mensajeRecibido.ultimoMensaje);

//losBytes = bytes.toByteArray();

for(contador = 0; contador < 12288; contador++)//12288: cantidad de bytes en el archivo
{
String num = "";
while (bytes.toString().charAt(contador)!=13)
num += bytes.toString().charAt(contador);
losBytes[contador] = Integer.parseInt(num);
}

// Se cierra socket y fichero
ois.close();
socket.close();

} catch (Exception e)
{
e.printStackTrace();
}

GRACIAS!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:.toByteArray(). Posible solucion??

Publicado por Juan (131 intervenciones) el 31/05/2006 14:48:34
Diox... yo habia mandado una respuesta ayer a este mensaje y no llego. que bolas.

http://www.programacion.com/java/tutorial/2d/

http://www.cica.es/formacion/JavaTut/Cap5/mediatk.html

http://www.cica.es/formacion/JavaTut/Intro/tabla.html#grafico

http://www.itapizaco.edu.mx/paginas/JavaTut/froufe/parte15/cap15-8.html

Lo que te mandaba eran otra formas que vi para guardar imagenes a ver si alguna se adapta mas a tu solucion.

Ahora lo otro que estaba viendo, lo del 203 realmente si es un byte, porque un componente RGB se representa en un byte sin signo. Porque en vez de asignar 203 eb tu ByteArray no haces una asignacion con bits mediante mascaras? Porque si es asi el bit guardaria su representacion y habria que ver como lo interpreta el Open GL, si lo ve como un valor negativo y se tira 3 o si ve el byte que el representa.

Bueno, despues me dices que tal te fue a ver que mas se nos ocurre
Juan
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:.toByteArray(). Posible solucion??

Publicado por lilu (112 intervenciones) el 31/05/2006 15:11:20
Jajaja. me alegra que seas una persona NORMAL !!...

Chui tambien me dio su opinion al respecto, voy a ver los link que me pasaste a ver que onda y tienes razon cuando me dices: "lo del 203 realmente si es un byte", Sí !!...

Esto fue lo que me dijo Chui:

"La forma más sencilla de hacer esto es que en el servidor hubieras mandado directamente el fichero .png, en vez de convertirlo a otro fichero .dat y enviar ese fichero. En el cliente, una vez recibido, sacas los bytes de rgb igual que lo estás haciendo ahora en el servidor. En vez de meterlos en un fichero, podrías meterlos en un ByteBuffer que lo traga directamente tu función de openg. ByteBuffer tiene metodos de get() y put() byte, con lo que podrías construirlo fácilmente.

Si quieres dejarlo como esta, en vez de leerlo en un ByteArrayOutputStream, crea un BufferedReader así

BufferedReader d = new BufferedReader(new InputStreamReader(in));

donde in es el socket.getInputStream().

Una vez hecho esto, con d.readLine() obtienes como String consecutivamente los rgb que fuiste escribiendo. Debes convertir cada uno de ellos a entero asi

Integer r = Integer.parseInt (d.readLine());
Integer g = Integer.parseInt (d.readLine());
..."

Como no estoy muy ducha con java entonces tengo que investigar que hace realmente BufferedReader...

Y esto no se porque me lo dice:
Integer r = Integer.parseInt (d.readLine());

Es decir, no se que voy a hacer con eso!!

Gracias Juan!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:.toByteArray(). Posible solucion??

Publicado por Juan (131 intervenciones) el 31/05/2006 15:16:11
Por alli hay un post mio donde le mande a un chamo varios enlaces de BuferredReader..............

Lo del get y el put es cierto, pero como lo use en Visual C no se si eso aplica para Java.

Si no encuentras el post me avisas para mandarte los links entonces. Yo por un momento te iba a preguntar eso, porque mandabas la imagen del cliente al servidor asi, pero como algo de la uni imagine que era un requerimiento del profesor, a veces nosotros los profesores nos pasamos de ratas jejejejeje
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:.toByteArray(). Posible solucion??

Publicado por lilu (112 intervenciones) el 31/05/2006 14:57:56
Buenos dias!!

Por cierto, esto es lo que contiene el archivo que el servidor le pasa al cliente:

203
203
209
200
200
205
201
202
205
199
202
203
197
201
206
.
.
.
.
.

En total son 12.288 numeros, ya que la imagen es de 64x64 pixeles, o sea:
64 x 64 x 3 = 12.288
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar