2012-11-28 29 views
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); 

大小調整方法與上述調用。解譯圖像

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

,你可以告訴代碼是巨大的,最有可能低效

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

服務器。我可以發送10次圖像的1/10用於和高度,而不是使用這些部分,但我想知道是否有更簡單的方法來完成此操作。

+0

,我認爲這是與該 有點類似http://stackoverflow.com/questions/5113914/large-file-轉移帶,插座 –

+0

這就是類似於我在做什麼,但我的字節數組是太強大,能夠處理任何事情>爲125x125 – user1729831

+0

我試圖避免讀多件 – user1729831

回答

1

您應該考慮通過網絡傳輸數據流。您可以使用第三方庫,如RMIIO。如果您可以使用Web服務進行數據傳輸,那麼您可以查看消息傳輸優化機制(MTOM),它可以讓您以更有效的方式傳輸數據。欲瞭解更多詳情,請看看here

+0

我稍後會看一看,但這似乎是我簡​​要閱讀後需要的。謝謝! – user1729831

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(); 
     } 
    } 
} 
相關問題