//代码1:
import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.Dimension;
/*
 * 产生图象
 */
public class ImageProvider {

private Dimension screenSize;
private Robot robot=null;//图象采集类
private Rectangle rect=null;//要复制的 屏幕区域
/*
 * 
 */
/*
 * 构造函数,输入要采集的屏幕的 矩形信息
 */
public ImageProvider() throws AWTException{
screenSize = Toolkit.getDefaultToolkit().getScreenSize();

rect=new Rectangle(0, 0, (int) screenSize.getWidth(),
                (int) screenSize.getHeight());//可以指定捕获屏幕区域
robot=new Robot();//创建Robot对象
}
   /*
    * 复制全屏幕,返回BufferedImage对象
    */
public BufferedImage CopyScreen(){

return robot.createScreenCapture(rect);//
     
}
   }//代码2:import java.awt.AWTException;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;public class SendImageThread extends Thread{

ImageProvider impv=null;
Socket client=null;
int PORT;

BufferedImage image=null;
ObjectOutputStream send=null;
SendImageThread(InetAddress server_ip,int port) throws IOException, AWTException{
     
       client=new Socket(server_ip,port);  //建立套接并初始化 图象发送流
        client.setSendBufferSize(1024);//设置发送缓冲
        impv=new ImageProvider(); }
public void run(){

int i=0;
OutputStream out=null;
JPEGImageEncoder encoder=null;//压缩为JEPG

try {
out = client.getOutputStream();
encoder = JPEGCodec.createJPEGEncoder (out) ; 
} catch (IOException e1) {
    
e1.printStackTrace();
}
while(true){
 image=impv.CopyScreen();//此处是获取BufferedImage对象
 try{           encoder.encode(image);  //提示的这个地方出错
     
 Thread.sleep(Parameter.IMAGE_get_time);
}catch(IOException e){
 i++; 
         tools.print("无法写入对象~"+i);
e.printStackTrace();
if(i==10)break;
}
catch(InterruptedException sd){
tools.print("INTERRUPTED~");
}
      }
  }
}只要程序不断获发送JPG流,可能在一分多钟就会抛出异常,实在搞不懂错在哪?java.io.IOException: reading encoded JPEG Stream 
at sun.awt.image.codec.JPEGImageEncoderImpl.writeJPEGStream(Native Method)
at sun.awt.image.codec.JPEGImageEncoderImpl.encode(JPEGImageEncoderImpl.java:472)
at sun.awt.image.codec.JPEGImageEncoderImpl.encode(JPEGImageEncoderImpl.java:228)
at SendImageThread.run(SendImageThread.java:47)

解决方案 »

  1.   

    reading encoded JPEG Stream 你是要压缩为JPEG,而encoder.encode(image);的时候image已经是JPEG格式的了至于为什么,你给的代码段太短了,自己查查吧或者encoder.encode(image);前判断下,是JPG了就不转了
      

  2.   


    我给的代码已经是个独立模块了!!
    我参考了很多类似的做法都使用这种做法,你的“image已经是JPEG格式的了
    ”说法,我不同意,因为编码成JPGe之前都是位图!!!
      

  3.   

    不要用sun的包,最好用jdk自带的。sun的包既然没有出现在jdk里面很可能就是因为本身就是其内部测试使用的。把你encoder.encode(image); 这句话去掉。改用JDK自带的ImageIO输出。