1

クライアントからサーバーに、サイズ変更された 125 x 125 の画像を正常に送信して描画できます。唯一の問題は、それが小さすぎることです。より大きな画像を送信できるようにしたいのですが、バイト配列では処理できず、Java ヒープ例外が発生します。現在、これを使用して自分のイメージを解釈しています。より効率的な方法はありますか?

クライアント上

screenShot = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
                screenShot = resize(screenShot, 125, 125);

                ByteArrayOutputStream byteArrayO = new ByteArrayOutputStream();
                ImageIO.write(screenShot,"PNG",byteArrayO);
                byte [] byteArray = byteArrayO.toByteArray();
                out.writeLong(byteArray.length);
                out.write(byteArray);

上記のサイズ変更メソッド。

    public static BufferedImage resize(BufferedImage img, int newW, int newH) {  
    int w = img.getWidth();  
    int h = img.getHeight();  
    BufferedImage dimg = new BufferedImage(newW, newH, img.getType()); 
    Graphics2D g = dimg.createGraphics();  
    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
    RenderingHints.VALUE_INTERPOLATION_BILINEAR);  
    g.drawImage(img, 0, 0, newW, newH, 0, 0, w, h, null);  
    g.dispose();  
    return dimg;  
   } 

画像を解釈するサーバー

in = new DataInputStream(Client.getInputStream());
            long nbrToRead = in.readLong();
            byte[] byteArray = new byte[(int) nbrToRead];
            int nbrRd = 0;
            int nbrLeftToRead = (int) nbrToRead;

            while (nbrLeftToRead > 0) {
                int rd = in.read(byteArray, nbrRd, nbrLeftToRead);
                if (rd < 0)
                    break;
                nbrRd += rd; // accumulate bytes read
                nbrLeftToRead -= rd;
            }
            ByteArrayInputStream byteArrayI = new ByteArrayInputStream(
                    byteArray);
            image = ImageIO.read(byteArrayI);

            if (image != null) {
                paint(f.getGraphics(), image);
            } else {
                System.out.println("null image.");
            }

コードが膨大で、おそらく非効率的であることがわかります。with と height の画像の 1/10 を 10 回送信して、代わりにそれらの部分を描画することもできましたが、これを行う簡単な方法があるかどうか知りたかったのです。

4

2 に答える 2

1

おそらく、データをネットワーク経由でストリームとして転送することを考える必要があります。RMIIOなどのサードパーティ ライブラリを利用できます。Web サービスを使用してデータ転送を行うことができる場合は、より効率的な方法でデータをストリームとして転送できる Message Transmission Optimization Mechanism (MTOM) を見ることができます。詳しくはこちらをご覧ください

于 2012-11-28T02:32:54.400 に答える
0

これは私のために働いた

public class ImageClient {

  public static void main(String[] args) throws AWTException, IOException {

    BufferedImage screenShot = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
    Socket socket = new Socket("localhost",11111);
    MemoryCacheImageOutputStream byteArrayO = new MemoryCacheImageOutputStream(socket.getOutputStream());
    ImageIO.write(screenShot, "PNG", byteArrayO);
    byteArrayO.flush();
    socket.close();
  }

}


public class ImageServer {

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ServerSocket ss = new ServerSocket(11111);
        try{
            Socket s = ss.accept();
            InputStream is = s.getInputStream();
            MemoryCacheImageInputStream ois = new MemoryCacheImageInputStream(is);
            ImageIO.read(ois);
            s.close();
        }finally{
            ss.close();
        }
   }
}
于 2012-11-28T02:46:18.553 に答える