RE:.toByteArray(). Posible solucion??
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!!