[SOURCE]Capturando imagen y enviandola por sockets para reconstruirla

Iniciado por Debci, 6 Agosto 2010, 13:04 PM

0 Miembros y 1 Visitante están viendo este tema.

Debci

Buenas a todos, programando un regalito para el foro y la comunidad, ha nacido un source bastante interesante!

Queria realizar capturas en un equipo remoto, y convertirlas a un arreglo de bytes para luego enviarlas (si queremos fragmentado :D) para luego reconstruirlo en el pc remoto:

Realizando la captura:

Código (java) [Seleccionar]
public static File getScreenShot()
{
String fileName="/root/captura01.png";
Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
Rectangle screenRectangle = new Rectangle(screenSize);
Robot robot = null;
try {
robot = new Robot();
} catch (AWTException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
BufferedImage image = robot.createScreenCapture(screenRectangle);
try {
ImageIO.write(image, "png", new File(fileName));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

//----

try
{



robot.createScreenCapture(screenRectangle);

}
catch(Exception e)
{
e.printStackTrace();
}
File imageFile = new File(fileName);

return imageFile;

}


Obteniendola y escribiendo a un arreglo de bytes:

Código (java) [Seleccionar]

File captura = null;
captura = funciones.getScreenShot();

try {
InputStream is = new FileInputStream(captura);
long length = captura.length();
if (length > Integer.MAX_VALUE) {
        System.out.println("El archivo es demasiado grande!");
    }

    // Create the byte array to hold the data
    byte[] bytes = new byte[(int)length];

    // Read in the bytes
    int offset = 0;
    int numRead = 0;
    while (offset < bytes.length
           && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
        offset += numRead;
    }

    // Ensure all the bytes have been read in
    if (offset < bytes.length) {
        throw new IOException("No se puede leer completamente el archivo "+captura.getName());
    }

    // Close the input stream and return bytes
    is.close();


Y ahora tratandola, por ejemplo enviarla:
Código (java) [Seleccionar]

Socket cliente = new Socket("localhost",666);
DataOutputStream os = new OutputStream(cliente.getOutputStream());
for(int i = 0; i < bytes.length; i++)
{
os.write(bytes[i]);
S}

Y los vamos reciviendo recursivamente (muy parecido a lo anterior)

Y ahora lo escribimos a un fichero:
Código (java) [Seleccionar]

                  File imagenFinal = new File("/root/imagencopiada.jpg");
      FileOutputStream fileNuevo = new FileOutputStream(imagenFinal);
      fileNuevo.write(bytes);


Y habremos transferido nuestra imagen!


Saludos

egyware

En mi opinion:
Muy Engorroso, que quieres que te diga. Usuaria esta opción si solo si no tuviera memoria.
Por que no pruebas en vez de enviarlo a un archivo lo envias e un ByteOutputStream? y luego envias ese ByteOutputStream por socket.
Todo lo demás esta muy bien y muy bien hecho.

Revisa este mensaje:
http://foro.elhacker.net/java/enviar_un_bufferedimage_a_travez_de_socket-t177615.0.html;msg845781#msg845781

Saludos

Debci

Cita de: egyware en  6 Agosto 2010, 17:04 PM
En mi opinion:
Muy Engorroso, que quieres que te diga. Usuaria esta opción si solo si no tuviera memoria.
Por que no pruebas en vez de enviarlo a un archivo lo envias e un ByteOutputStream? y luego envias ese ByteOutputStream por socket.
Todo lo demás esta muy bien y muy bien hecho.

Revisa este mensaje:
http://foro.elhacker.net/java/enviar_un_bufferedimage_a_travez_de_socket-t177615.0.html;msg845781#msg845781

Saludos
Se agradece jeje, que dedique mi tiempo libre a esto y de sus frutos.

Ahora compruebo lo que me comentaste.

Saludos

Leyer

Sabian que se puede enviar una imagen por sockes con tan solo 4 lineas y recibirla en 4 tambien, No se por que se complican :xD

Debci

Cita de: LEYER en  6 Agosto 2010, 20:43 PM
Sabian que se puede enviar una imagen por sockes con tan solo 4 lineas y recibirla en 4 tambien, No se por que se complican :xD
Mmm yo es que soy muy cutre y me complico mucho la vida, como sugieres que lo haga?

Saludos

Leyer

Primero eso de escribirla y leerla como archivo es innecesario

Puedes hacer todo internamente es decir

Código (java) [Seleccionar]
java.awt.image.BufferedImage bufferedImage=new java.awt.Robot().createScreenCapture(new java.awt.Rectangle(
Toolkit.getDefaultToolkit().getScreenSize()));


Y la envias con ImageIO, segun el API de este


static boolean write(RenderedImage im, String formatName, OutputStream output)


Puedes especificarle un OutputStream en este caso sera el OutputStream del Socket.

Example
Código (java) [Seleccionar]

javax.imageio.ImageIO.write(bufferedImage, "png",socket.getOutputStream());


Ya con eso se enviaría correctamente.

Y para recibirla en el Servidor puedes hacerlo tambien con ImageIO

static BufferedImage read(InputStream input)

Example:
Código (java) [Seleccionar]

BufferedImage b = ImageIO.read(socket.getInputStream());
ImageIO.write(b, "png", new File("Screenshot.png"));


y asi tendrias 4 lineas para enviar y 4 para recibir una imagen ;)

Un saludo.

Debci