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 -