Java-dip-downloading-uploading-images
画像のダウンロードとアップロード
この章では、インターネットから画像をダウンロードし、画像に対していくつかの画像処理技術を実行し、処理した画像をサーバーに再度アップロードする方法について説明します。
画像をダウンロードする
ウェブサイトから画像をダウンロードするには、 URL という名前のJavaクラスを使用します。これは java.net パッケージにあります。 その構文は以下のとおりです-
String website = "http://finddevguides.com";
URL url = new URL(website);
上記のメソッドとは別に、簡単に説明したように、クラスURLで利用可能な他のメソッドがあります-
Sr.No. | Method & Description |
---|---|
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のホストを返します。 |
例
次の例は、Java URLクラスを使用してインターネットから画像をダウンロードする方法を示しています-
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://finddevguides.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);
画像をバイト配列に変換するには、 ByteArrayOutputStream クラスの* toByteArray()*メソッドを使用します。 その構文は以下のとおりです-
byte[] bytes = baos.toByteArray();
上記のメソッドとは別に、簡単に説明したようにByteArrayOutputStreamクラスで利用可能な他のメソッドがあります-
Sr.No. | Method & Description |
---|---|
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) オフセットoffから始まるlen個のバイトをストリームに書き込みます。 |
6 |
public void writeTo(OutputStream outSt) このStreamのコンテンツ全体を指定されたストリーム引数に書き込みます。 |
例
次の例は、サーバーに画像をアップロードする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);
}
}
出力
クライアント側の出力
あなたがクライアントコードを実行すると、次の出力がクライアント側に表示されます-
サーバー側の出力
サーバーコードを実行すると、サーバー側に次の出力が表示されます-
画像を受信した後、サーバーは以下に示すように画像を表示します-