Download e upload de imagens

Neste capítulo, veremos como você pode baixar uma imagem da Internet, executar algumas técnicas de processamento de imagem na imagem e, em seguida, enviar novamente a imagem processada para um servidor.

Baixando uma imagem

Para baixar uma imagem de um site, usamos a classe java chamada URL, que pode ser encontrado em java.netpacote. Sua sintaxe é fornecida abaixo -

String website = "http://tutorialspoint.com";
URL url = new URL(website);

Além do método acima, existem outros métodos disponíveis na URL da classe, conforme descrito brevemente -

Sr. Não. Método e Descrição
1

public String getPath()

Ele retorna o caminho do URL.

2

public String getQuery()

Ele retorna a parte da consulta do URL.

3

public String getAuthority()

Ele retorna a autoridade do URL.

4

public int getPort()

Ele retorna a porta do URL.

5

public int getDefaultPort()

Ele retorna a porta padrão para o protocolo da URL.

6

public String getProtocol()

Ele retorna o protocolo do URL.

7

public String getHost()

Ele retorna o host do URL.

Exemplo

O exemplo a seguir demonstra o uso da classe Java URL para baixar uma imagem da Internet -

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import java.net.URL;

public class Download {

   public static void main(String[] args) throws Exception {
   
      try{
         String fileName = "digital_image_processing.jpg";
         String website = "http://tutorialspoint.com/java_dip/images/"+fileName;
         
         System.out.println("Downloading File From: " + website);
         
         URL url = new URL(website);
         InputStream inputStream = url.openStream();
         OutputStream outputStream = new FileOutputStream(fileName);
         byte[] buffer = new byte[2048];
         
         int length = 0;
         
         while ((length = inputStream.read(buffer)) != -1) {
            System.out.println("Buffer Read of length: " + length);
            outputStream.write(buffer, 0, length);
         }
         
         inputStream.close();
         outputStream.close();
         
      } catch(Exception e) {
         System.out.println("Exception: " + e.getMessage());
      }
   }
}

Resultado

Quando você executa o dado acima, a seguinte saída é vista.

Ele baixaria a seguinte imagem do servidor.

Carregando uma imagem

Vamos ver como fazer o upload de uma imagem para um servidor web. Convertemos um BufferedImage em um array de bytes para enviá-lo ao servidor.

Usamos classe Java ByteArrayOutputStream, que pode ser encontrado em java.iopacote. Sua sintaxe é fornecida abaixo -

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", baos);

Para converter a imagem em uma matriz de bytes, usamos toByteArray() método de ByteArrayOutputStreamclasse. Sua sintaxe é fornecida abaixo -

byte[] bytes = baos.toByteArray();

Além do método acima, existem outros métodos disponíveis na classe ByteArrayOutputStream conforme descrito brevemente -

Sr. Não. Método e Descrição
1

public void reset()

Este método redefine o número de bytes válidos do fluxo de saída da matriz de bytes para zero, de modo que toda a saída acumulada no fluxo seja descartada.

2

public byte[] toByteArray()

Este método cria uma nova matriz de bytes alocada. Seu tamanho seria o tamanho atual do fluxo de saída e o conteúdo do buffer será copiado para ele. Ele retorna o conteúdo atual do fluxo de saída como uma matriz de bytes.

3

public String toString()

Converte o conteúdo do buffer em uma string. A tradução será feita de acordo com a codificação de caracteres padrão. Ele retorna a String traduzida do conteúdo do buffer.

4

public void write(int w)

Ele grava a matriz especificada no fluxo de saída.

5

public void write(byte []b, int of, int len)

Ele escreve um número de bytes a partir do deslocamento até o fluxo.

6

public void writeTo(OutputStream outSt)

Ele grava todo o conteúdo deste Stream no argumento stream especificado.

Exemplo

O exemplo a seguir demonstra ByteArrayOutputStream para fazer upload de uma imagem para o servidor -

Código do cliente

import javax.swing.*;  
import java.net.*; 
import java.awt.image.*;
import javax.imageio.*;
import java.io.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Client{
   public static void main(String args[]) throws Exception{
   
      Socket soc;
      BufferedImage img = null;
      soc=new Socket("localhost",4000);
      System.out.println("Client is running. ");
      
      try {
         System.out.println("Reading image from disk. ");
         img = ImageIO.read(new File("digital_image_processing.jpg"));
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         
         ImageIO.write(img, "jpg", baos);
         baos.flush();
         
         byte[] bytes = baos.toByteArray();
         baos.close();
         
         System.out.println("Sending image to server. ");
         
         OutputStream out = soc.getOutputStream(); 
         DataOutputStream dos = new DataOutputStream(out);
         
         dos.writeInt(bytes.length);
         dos.write(bytes, 0, bytes.length);
         
         System.out.println("Image sent to server. ");

         dos.close();
         out.close();
         
      } catch (Exception e) {
         System.out.println("Exception: " + e.getMessage());
         soc.close();
      }
      soc.close();
   }
}

Código do Servidor

import java.net.*;
import java.io.*;
import java.awt.image.*;

import javax.imageio.*; 
import javax.swing.*; 

class Server {
   public static void main(String  args[]) throws Exception{
      ServerSocket server=null;
      Socket socket;
      server = new ServerSocket(4000);
      System.out.println("Server Waiting for image");

      socket = server.accept();
      System.out.println("Client connected.");
      
      InputStream in = socket.getInputStream();
      DataInputStream dis = new DataInputStream(in);

      int len = dis.readInt();
      System.out.println("Image Size: " + len/1024 + "KB");
      
      byte[] data = new byte[len];
      dis.readFully(data);
      dis.close();
      in.close();

      InputStream ian = new ByteArrayInputStream(data);
      BufferedImage bImage = ImageIO.read(ian);
 
      JFrame f = new JFrame("Server");
      ImageIcon icon = new ImageIcon(bImage);
      JLabel l = new JLabel();
      
      l.setIcon(icon);
      f.add(l);
      f.pack();
      f.setVisible(true);
   }
}

Resultado

Saída do lado do cliente

Quando você executa o código do cliente, a seguinte saída aparece no lado do cliente -

Saída do lado do servidor

Quando você executa o código do servidor, a seguinte saída aparece no lado do servidor -

Depois de receber a imagem, o servidor exibe a imagem conforme mostrado abaixo -