簡體   English   中英

Java - 通過Socket發送指向BufferedImage的對象

[英]Java - Sending an object that points to a BufferedImage through a Socket

我和一群朋友正在研究Java項目,我們需要一些關於通過套接字發送對象的幫助。

到目前為止,我們已經實現了使用ObjectOutputStreamObjectInputStream通過套接字發送簡單對象(整數,字符串和諸如此類)。 然而,我們今天遇到了一個巨大的問題(對我們來說很大,無論如何^^)

我們有一個樹形結構,我們需要從一台PC發送到另一台PC。 問題是,在該樹的每個節點內,我們都有對BufferedImage的引用,並且它不可序列化。

我們今天已經研究了很多,我們發現我們可以使用ImageIO.write()通過套接字的OutputStream發送一個 BufferedImage,但是,這對我們沒有好處,因為我們不需要自己發送BufferedImage,但整個樹都在它的位置。

我們需要的是一種方法(如果它存在)序列化每個BufferedImage,在必要時將它轉換為另一個類,同時創建樹,並讓樹的每個節點引用新的可序列化類,因此樹可以作為整個對象......

我們真的不關心性能,因為我們發送的樹不是那么大(頂部10-15個節點)。 在此先感謝您的幫助,抱歉糟糕的英語。 哦,這是一個...好吧,一種功課,如果你想記住這一點:-)

謝謝!!

在每個節點上你可以使用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
    }
}

您可以在客戶端將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());
    }
}
}

如果要使用Objects Streams,可以將緩沖的圖像包裝在實現Serializable的類中,並且具有一個字節數組的屬性(圖像數據作為字節數組)。 您將不得不修改您的代碼,將BufferedImage引用更改為SerializableImage(類名示例)。

如果你這樣做,你的班級將被序列化並轉移..

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM