Java BufferedImage 网络传输问题

第一次写博客有点不太会写。。。。

因为参加比赛,需要服务器传输图片。socket的IO流被封装成ObjectOutputStream和ObjectInputStream的 所以传输数据的时候需要把数据包对象序列化,但是BufferedImage是不可序列化的,Java内核没有为它实现序列化接口(试过继承BufferedImage 和 序列化接口,本人java不熟可能重写有问题吧) 还是抛出不可序列化异常。于是通过BufferedImage转化成byte[](byte[]是序列化对象)可以解决序列化网络传输的问题

 1 package bean;
 2 
 3 import java.io.Serializable;
 4 
 5 public class PacketBean implements Serializable {
 6 
 7     private String packetType;
 8     private Object data;
 9     
10     public String getPacketType() {
11         return packetType;
12     }
13     public void setPacketType(String packetType) {
14         this.packetType = packetType;
15     }
16     public Object getData() {
17         return data;
18     }
19     public void setData(Object data) {
20         this.data = data;
21     }
22     
23 }

上面是数据包类

package util;

import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.Serializable;

import javax.imageio.ImageIO;

public class ScreenShots implements Serializable {
    
    public BufferedImage screenshot;
    

       public ByteArrayOutputStream snapShot() {           
           ByteArrayOutputStream out = new ByteArrayOutputStream(); 
       //    OutputStream outputStream = null; 

           Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
           
          try {
            // 拷贝屏幕到一个BufferedImage对象screenshot
            screenshot = (new Robot())
                .createScreenCapture(new Rectangle(0, 0,
                            (int) d.getWidth(), (int) d.getHeight()));                            
            // 将screenshot对象写入输出流
            ImageIO.write(screenshot, "jpg", out);
                    
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return out;
    }
       
}

图片数据包发送线程类

package thread;

import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import javax.imageio.ImageIO;

import util.ScreenShots;

import bean.PacketBean;

public class ScreenShotsThread extends Thread {

    private ObjectOutputStream objectOutputStream;

    public ScreenShotsThread(ObjectOutputStream objectOutputStream) {
        this.objectOutputStream = objectOutputStream;
    }

    @Override
    public void run() {    
        ScreenShots screenShots = new ScreenShots();
        ByteArrayOutputStream ByteArray = screenShots.snapShot();
        byte[] datas = ByteArray.toByteArray();    

        try {             
            PacketBean data = new PacketBean();
            data.setPacketType("sendshots");
            data.setData(datas);
            
            objectOutputStream.writeObject(data);
            objectOutputStream.flush();
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }    
 
    
    }
    
}


客户端接受图片线程类

package thread;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

import javax.imageio.ImageIO;

import bean.PacketBean;

public class CReadThead extends Thread {
    
    private Socket socket;
    private ObjectInputStream objectInputStream;

    public CReadThead(Socket socket, ObjectInputStream objectInputStream) {
        this.socket = socket;
        this.objectInputStream = objectInputStream;
    }

    @Override
    public void run() {
        while(true) {
            try {
                PacketBean data = (PacketBean) objectInputStream.readObject();
                if(data.getPacketType().equals("sendshots")) {
                    System.out.println("接受图片");
                    byte[] ob = (byte[])data.getData();
                    createBit(ob);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }            
        }
    }
    
    public void createBit(byte[] obj) throws IOException {    
        ByteArrayInputStream bin = new ByteArrayInputStream(obj);  
        BufferedImage image = ImageIO.read(bin);  
        ImageIO.write(image, "jpg", new File("C:/Users/admin/Desktop/2.jpg"));  
       
        bin.close();
        
    }    
    
}

 Android客户端接受图片资源Bitmap可以通过以下方式进行:

public void receiveBmp(Object obj) {
    byte[] bytes = (byte[]) obj;
    Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);            
}

转载于:https://www.cnblogs.com/EyesPHP/archive/2012/09/19/2692450.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值