//代码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)
reading encoded JPEG Stream
你是要压缩为JPEG,而encoder.encode(image);的时候image已经是JPEG格式的了
至于为什么,你给的代码段太短了,自己查查吧
或者encoder.encode(image);前判断下,是JPG了就不转了 我给的代码已经是个独立模块了!!
我参考了很多类似的做法都使用这种做法,你的“image已经是JPEG格式的了
”说法,我不同意,因为编码成JPGe之前都是位图!!!