Java-dip-downloading-uploading-images

提供:Dev Guides
移動先:案内検索

画像のダウンロードとアップロード

この章では、インターネットから画像をダウンロードし、画像に対していくつかの画像処理技術を実行し、処理した画像をサーバーに再度アップロードする方法について説明します。

画像をダウンロードする

ウェブサイトから画像をダウンロードするには、 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);
   }
}

出力

クライアント側の出力

あなたがクライアントコードを実行すると、次の出力がクライアント側に表示されます-

アップロード画像のダウンロード

サーバー側の出力

サーバーコードを実行すると、サーバー側に次の出力が表示されます-

アップロード画像のダウンロード

画像を受信した後、サーバーは以下に示すように画像を表示します-

アップロード画像のダウンロード