Отправка BufferedImages через сокеты

Я хочу отправить буферизованное изображение по сети как часть моего пользовательского класса.

В настоящее время я просто writeObject и readObject, чтобы получить свой класс.

Чтобы отправить изображение, которое я сейчас делаю:

((DataBufferByte) i.getData().getDataBuffer()).getData();

Как преобразовать это обратно в BufferedImage?

Есть ли лучший способ сделать это?

Класс, который я отправляю, выглядит так:

public class imagePack{

public byte[] imageBytes;
public String clientName;
public imagePack(String name, BufferedImage i){
    imageBytes = ((DataBufferByte) i.getData().getDataBuffer()).getData();
    clientName = name;
}

    public BufferedImage getImage(){
     //Do something to return it}

}

Спасибо еще раз


person Lemex    schedule 21.04.2013    source источник
comment
Отправить изображение, которое я сейчас делаю: Это неэффективный способ передачи изображений. Сначала закодируйте его в PNG или JPG.   -  person Andrew Thompson    schedule 21.04.2013
comment
Возможный дубликат: stackoverflow.com/questions/12705385/   -  person Cratylus    schedule 21.04.2013
comment
Я согласен с @Cratylus, но это кажется неэффективным.   -  person Lemex    schedule 21.04.2013
comment
@LmC: я думаю, что проблема OP заключается в том, как преобразовать DataBufferByte в BufferedImage. API дает byte[], поэтому проблема заключается в том, как преобразовать byte[] в BufferedImage, ответ на который есть в другом потоке SO. Я добавил это для справки.   -  person Cratylus    schedule 21.04.2013


Ответы (1)


Если вы хотите преобразовать это обратно в BufferedImage, вы также должны знать его ширину, высоту и тип.

class imagePack {

    public byte[] imageBytes;
    public int width, height, imageType;
    public String clientName;

    public imagePack(String name, BufferedImage i) {
        imageBytes = ((DataBufferByte) i.getData().getDataBuffer())
                .getData();
        width = i.getWidth();
        height = i.getHeight();
        imageType = i.getType();
        clientName = name;
    }

    public BufferedImage getImage() {
        if (imageType == BufferedImage.TYPE_CUSTOM)
            throw new RuntimeException("Failed to convert.");
        BufferedImage i2 = new BufferedImage(width, height, imageType);
        byte[] newImageBytes = ((DataBufferByte) i2.getData()
                .getDataBuffer()).getData();
        System.arraycopy(imageBytes, 0, newImageBytes, 0, imageBytes.length);
        return i2;
    }
}
person johnchen902    schedule 21.04.2013