首先来确定一下基本思路
一、显示阶段
1、打开摄像头,获得一张BufferedImage1,并获得他的宽、高
2、根据宽,高实例化一个BufferedImage2
3、把BufferedImage1上的每一个像素点画到BufferedImage2上
4、把BufferedImage2画到窗体上
二、发送阶段
1、BufferedImage的本质是一个二维数组,我们把二维数组写到输出流,发送
三、接受阶段
把数组字节流转换为一张图片,画到窗体上
发送端:
//打开默认摄像头,webcam 是一个Webcam类,需要大家提前下载好
webcam=Webcam.getDefault();
webcam.setViewSize(WebcamResolution.VGA.getSize());
webcam.open();
while(true) {
//从摄像头获取一张图片
BufferedImage img=webcam.getImage();/
if(img!=null) {
//字节数组输出流
ByteArrayOutputStream bos=new ByteArrayOutputStream();
//获得他的宽 、高
int width=img.getWidth();
int height=img.getHeight();
//处理后的照片
BufferedImage img2=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics g2=img2.getGraphics();
for(int i=0;i<width;i+=special) {//把img的每个颜色转移到img2上
for(int j=0;j<height;j+=special) {
int rgb=img.getRGB(i, j);
Color c=new Color(rgb);
g2.setColor(new Color(c.getRed(),c.getGreen(),c.getBlue()));
g2.drawLine(i, j,i, j);
}
}
//把图片写入bos输出流
try {
//ImageIO可以直接把img写到bos中
ImageIO.write(img,"jpg",bos);
g.drawImage(img2 ,0 , 0, null);//把img2画到窗体上
byte[] bytes=bos.toByteArray();//直接把数组输出流转给换位数组
//此处是我自己的方法,把bytes发送给对方
sa=SendApp.getInstance();
sa.sendVideoData(bytes);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
接收端
private void DrawCapture(byte[] buffer) {
//字节数组输入流
ByteArrayInputStream bis=new ByteArrayInputStream(buffer);
try {
//直接将字节数组输入流转换为依照图片
BufferedImage recvImg=ImageIO.read(bis);
VideoMessage.g.drawImage(recvImg, 0, 500, null);
} catch (IOException e) {
e.printStackTrace();
}
}