Téléchargement et téléchargement d'images

Dans ce chapitre, nous allons voir comment vous pouvez télécharger une image sur Internet, appliquer certaines techniques de traitement d'image sur l'image, puis télécharger à nouveau l'image traitée sur un serveur.

Téléchargement d'une image

Pour télécharger une image à partir d'un site Web, nous utilisons la classe java nommée URL, qui se trouve sous java.netpaquet. Sa syntaxe est donnée ci-dessous -

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

En dehors de la méthode ci-dessus, il existe d'autres méthodes disponibles dans l'URL de classe comme décrit brièvement -

N ° Sr. Méthode et description
1

public String getPath()

Il renvoie le chemin de l'URL.

2

public String getQuery()

Il renvoie la partie requête de l'URL.

3

public String getAuthority()

Il renvoie l'autorité de l'URL.

4

public int getPort()

Il renvoie le port de l'URL.

5

public int getDefaultPort()

Il renvoie le port par défaut pour le protocole de l'URL.

6

public String getProtocol()

Il renvoie le protocole de l'URL.

sept

public String getHost()

Il renvoie l'hôte de l'URL.

Exemple

L'exemple suivant illustre l'utilisation de la classe URL java pour télécharger une image à partir d'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());
      }
   }
}

Production

Lorsque vous exécutez ce qui précède, la sortie suivante s'affiche.

Il téléchargerait l'image suivante à partir du serveur.

Télécharger une image

Voyons comment télécharger une image sur un serveur Web. Nous convertissons un BufferedImage en tableau d'octets afin de l'envoyer au serveur.

Nous utilisons la classe Java ByteArrayOutputStream, qui se trouve sous java.iopaquet. Sa syntaxe est donnée ci-dessous -

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

Afin de convertir l'image en tableau d'octets, nous utilisons toByteArray() méthode de ByteArrayOutputStreamclasse. Sa syntaxe est donnée ci-dessous -

byte[] bytes = baos.toByteArray();

Outre la méthode ci-dessus, il existe d'autres méthodes disponibles dans la classe ByteArrayOutputStream comme décrit brièvement -

N ° Sr. Méthode et description
1

public void reset()

Cette méthode réinitialise le nombre d'octets valides du flux de sortie du tableau d'octets à zéro, de sorte que toute la sortie accumulée dans le flux est supprimée.

2

public byte[] toByteArray()

Cette méthode crée un tableau d'octets nouvellement alloué. Sa taille serait la taille actuelle du flux de sortie et le contenu du tampon y sera copié. Il renvoie le contenu actuel du flux de sortie sous forme de tableau d'octets.

3

public String toString()

Convertit le contenu du tampon en une chaîne. La traduction sera effectuée selon le codage de caractères par défaut. Il renvoie la chaîne traduite à partir du contenu du tampon.

4

public void write(int w)

Il écrit le tableau spécifié dans le flux de sortie.

5

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

Il écrit un nombre d'octets à partir du décalage vers le flux.

6

public void writeTo(OutputStream outSt)

Il écrit tout le contenu de ce Stream dans l'argument de flux spécifié.

Exemple

L'exemple suivant montre ByteArrayOutputStream pour télécharger une image sur le serveur -

Code client

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();
   }
}

Code serveur

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);
   }
}

Production

Sortie côté client

Lorsque vous exécutez le code client, la sortie suivante apparaît côté client -

Sortie côté serveur

Lorsque vous exécutez le code serveur, la sortie suivante apparaît côté serveur -

Après avoir reçu l'image, le serveur affiche l'image comme indiqué ci-dessous -