Pobieranie i przesyłanie obrazów
W tym rozdziale zobaczymy, jak można pobrać obraz z Internetu, wykonać na nim kilka technik przetwarzania obrazu, a następnie ponownie przesłać przetworzony obraz na serwer.
Pobieranie obrazu
Aby pobrać obraz ze strony internetowej, używamy klasy java o nazwie URL, które można znaleźć pod java.netpakiet. Jego składnia jest podana poniżej -
String website = "http://tutorialspoint.com";
URL url = new URL(website);
Oprócz powyższej metody istnieją inne metody dostępne w adresie URL klasy, jak opisano w skrócie -
Sr.No. | Metoda i opis |
---|---|
1 | public String getPath() Zwraca ścieżkę adresu URL. |
2 | public String getQuery() Zwraca część adresu URL zawierającą zapytanie. |
3 | public String getAuthority() Zwraca autorytet adresu URL. |
4 | public int getPort() Zwraca port adresu URL. |
5 | public int getDefaultPort() Zwraca domyślny port protokołu adresu URL. |
6 | public String getProtocol() Zwraca protokół adresu URL. |
7 | public String getHost() Zwraca hosta adresu URL. |
Przykład
Poniższy przykład demonstruje użycie klasy URL języka Java do pobierania obrazu z Internetu -
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());
}
}
}
Wynik
Gdy wykonasz powyższe, zobaczysz następujące dane wyjściowe.
Pobrałby następujący obraz z serwera.
Przesyłanie obrazu
Zobaczmy, jak przesłać obraz na serwer WWW. Konwertujemy BufferedImage na tablicę bajtów, aby wysłać ją na serwer.
Używamy klasy Java ByteArrayOutputStream, które można znaleźć pod java.iopakiet. Jego składnia jest podana poniżej -
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", baos);
Aby przekonwertować obraz na tablicę bajtów, używamy toByteArray() metoda ByteArrayOutputStreamklasa. Jego składnia jest podana poniżej -
byte[] bytes = baos.toByteArray();
Oprócz powyższej metody istnieją inne metody dostępne w klasie ByteArrayOutputStream, jak opisano w skrócie -
Sr.No. | Metoda i opis |
---|---|
1 | public void reset() Ta metoda resetuje liczbę prawidłowych bajtów strumienia wyjściowego tablicy bajtów do zera, tak aby wszystkie skumulowane dane wyjściowe w strumieniu zostały odrzucone. |
2 | public byte[] toByteArray() Ta metoda tworzy nowo przydzieloną tablicę Byte. Jego rozmiar byłby aktualnym rozmiarem strumienia wyjściowego, a zawartość bufora zostanie do niego skopiowana. Zwraca bieżącą zawartość strumienia wyjściowego jako tablicę bajtów. |
3 | public String toString() Konwertuje zawartość buforu na ciąg. Tłumaczenie zostanie wykonane zgodnie z domyślnym kodowaniem znaków. Zwraca ciąg przetłumaczony z zawartości bufora. |
4 | public void write(int w) Zapisuje określoną tablicę w strumieniu wyjściowym. |
5 | public void write(byte []b, int of, int len) Zapisuje len liczbę bajtów, zaczynając od przesunięcia do strumienia. |
6 | public void writeTo(OutputStream outSt) Zapisuje całą zawartość tego strumienia do określonego argumentu strumienia. |
Przykład
Poniższy przykład demonstruje ByteArrayOutputStream, aby przesłać obraz na serwer -
Kod klienta
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();
}
}
Kod serwera
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);
}
}
Wynik
Wyjście po stronie klienta
Podczas wykonywania kodu klienta po stronie klienta pojawia się następujący wynik -
Wyjście po stronie serwera
Po wykonaniu kodu serwera po stronie serwera pojawia się następujący plik ouptut -
Po otrzymaniu obrazu serwer wyświetla obraz, jak pokazano poniżej -