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);

上面调用的 resize 方法。

    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.");
            }

正如您所知道的,代码量很大,而且很可能效率低下。我可以将图像的 1/10 发送 10 次以获得 with 和 height,而不是在这些部分上绘制,但我想知道是否有更简单的方法来做到这一点。

4

2 回答 2

1

您可能应该将数据视为通过网络传输的流。您可以使用RMIIO等第三方库。如果您可以使用 Web 服务进行数据传输,那么您可以查看消息传输优化机制 (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 回答