画像のダウンロードとアップロード
この章では、インターネットから画像をダウンロードし、画像に対していくつかの画像処理技術を実行してから、処理された画像をサーバーに再度アップロードする方法を説明します。
画像のダウンロード
ウェブサイトから画像をダウンロードするために、という名前のJavaクラスを使用します URL、の下にあります java.netパッケージ。その構文を以下に示します-
String website = "http://tutorialspoint.com";
URL url = new URL(website);
上記のメソッドとは別に、簡単に説明したように、クラスURLで使用できる他のメソッドがあります-
シニア番号 | 方法と説明 |
---|---|
1 | public String getPath() URLのパスを返します。 |
2 | public String getQuery() URLのクエリ部分を返します。 |
3 | public String getAuthority() URLの権限を返します。 |
4 | public int getPort() URLのポートを返します。 |
5 | public int getDefaultPort() URLのプロトコルのデフォルトポートを返します。 |
6 | public String getProtocol() URLのプロトコルを返します。 |
7 | public String getHost() URLのホストを返します。 |
例
次の例は、JavaURLクラスを使用してインターネットから画像をダウンロードする方法を示しています。
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());
}
}
}
出力
上記を実行すると、次の出力が表示されます。
サーバーから次の画像をダウンロードします。
画像のアップロード
画像をウェブサーバーにアップロードする方法を見てみましょう。BufferedImageをサーバーに送信するためにバイト配列に変換します。
Javaクラスを使用します ByteArrayOutputStream、の下にあります java.ioパッケージ。その構文を以下に示します-
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", baos);
画像をバイト配列に変換するために、 toByteArray() の方法 ByteArrayOutputStreamクラス。その構文を以下に示します-
byte[] bytes = baos.toByteArray();
上記のメソッドとは別に、簡単に説明したように、ByteArrayOutputStreamクラスで使用できる他のメソッドがあります。
シニア番号 | 方法と説明 |
---|---|
1 | public void reset() このメソッドは、バイト配列出力ストリームの有効なバイト数をゼロにリセットするため、ストリームに蓄積されたすべての出力が破棄されます。 |
2 | public byte[] toByteArray() このメソッドは、新しく割り当てられたバイト配列を作成します。そのサイズは出力ストリームの現在のサイズになり、バッファの内容がそこにコピーされます。出力ストリームの現在の内容をバイト配列として返します。 |
3 | public String toString() バッファの内容を文字列に変換します。翻訳は、デフォルトの文字エンコードに従って行われます。バッファの内容から翻訳された文字列を返します。 |
4 | public void write(int w) 指定された配列を出力ストリームに書き込みます。 |
5 | public void write(byte []b, int of, int len) オフセットオフから始まるlenバイト数をストリームに書き込みます。 |
6 | public void writeTo(OutputStream outSt) このストリームのコンテンツ全体を、指定されたストリーム引数に書き込みます。 |
例
次の例は、サーバーに画像をアップロードするByteArrayOutputStreamを示しています-
クライアントコード
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();
}
}
サーバーコード
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);
}
}
出力
クライアント側の出力
クライアントコードを実行すると、クライアント側に次の出力が表示されます-
サーバー側の出力
サーバーコードを実行すると、サーバー側に次の出力が表示されます-
画像を受信すると、サーバーは次のように画像を表示します-