Java - 通过 Socket 发送指向 BufferedImage 的对象

问题描述 投票:0回答:4

我和一群朋友正在开发一个 Java 项目,我们需要一些有关通过套接字发送对象的帮助。

到目前为止,我们已经使用

ObjectOutputStream
ObjectInputStream
实现了通过套接字发送简单对象(整数、字符串等)。然而,我们今天遇到了一个大问题(对我们来说是个大问题,无论如何^^)

我们有一个树结构,我们需要将其从一台PC发送到另一台PC。问题是,在该树的每个节点中,我们都有一个对 BufferedImage 的引用,并且它不可序列化。

我们今天研究了很多,发现我们可以使用

ImageIO.write()
通过套接字的 OutputStream 发送 one BufferedImage,但这对我们没有好处,因为我们不需要自己发送 BufferedImage ,而是它所在的整棵树。

我们需要的是一种方法(如果存在)来序列化每个 BufferedImage,必要时将其转换为另一个类,同时创建树,并让树的每个节点引用新的可序列化类,以便可以发送树作为一个整体对象...

我们真的不关心性能,因为我们发送的树并没有那么大(顶部有 10-15 个节点)。预先感谢您的帮助,对于糟糕的英语表示抱歉。哦,这是为了......好吧,一种家庭作业,以防你想记住这一点:-)

谢谢!!

java sockets bufferedimage serializable
4个回答
6
投票

在每个节点上,您可以使用 writeObject() 和 readObject() 检查 http://java.sun.com/developer/technicalArticles/Programming/serialization/ 了解更多信息

本质上会变成

public Node implements Serializable{

    transient BufferedImage buff;//transient make it so it won't be written with defaultWriteObject (which would error)

    private void writeObject(ObjectOutputStream out)throws IOException{
        out.defaultWriteObject();
        //write buff with imageIO to out
    }

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException{
        in.defaultReadObject();
        //read buff with imageIO from in
    }
}

3
投票

您可以在客户端将 BufferedImage 转换为字节数组,然后作为普通字节数组发送,然后在服务器端从该字节数组创建 BufferedImage。下面是将 BufferedImage 转换为字节数组的代码,反之亦然。

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;

public class ImageTest {

public static void main(String[] args) {

    try {

        byte[] imageInByte;
        BufferedImage originalImage = ImageIO.read(new File(
                "c:/darksouls.jpg"));

        // convert BufferedImage to byte array
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(originalImage, "jpg", baos);
        baos.flush();
        imageInByte = baos.toByteArray();
        baos.close();

        // convert byte array back to BufferedImage
        InputStream in = new ByteArrayInputStream(imageInByte);
        BufferedImage bImageFromConvert = ImageIO.read(in);

        ImageIO.write(bImageFromConvert, "jpg", new File(
                "c:/new-darksouls.jpg"));

    } catch (IOException e) {
        System.out.println(e.getMessage());
    }
}
}

0
投票

如果您想使用对象流,您可以将缓冲图像包装在实现可序列化并具有字节数组属性(图像数据为字节数组)的类中。您必须修改代码,将 BufferedImage 引用更改为 SerializedImage(类名示例)..

如果你这样做,你的类将被序列化并转移..


0
投票

我对此进行了很多搜索,因为我需要通过套接字发送 bufferedImage 而不是文件,并发现您可以将 BufferedImage 转换为 ImageIcon,因此您可以使用 ObjectOutputStream 发送该对象,因为它是可序列化的,有还有其他方法,但在我的代码中不起作用,希望这对某人有用。

© www.soinside.com 2019 - 2024. All rights reserved.