Передача изображений между C ++ и Java через Socket - PullRequest
1 голос
/ 20 сентября 2010

Я хотел бы перенести изображение из Java приложения в приложение C ++ .Я использую сокеты в качестве метода связи, и сейчас это хорошо работает со строками.

Я хочу иметь возможность передавать его в обе стороны (Java <-> C ++).

ИзображениеНЕ является файлом, это объект памяти / структура .Поэтому моя основная проблема заключается в том, как кодировать изображение для передачи, чтобы его можно было использовать в Java и в C ++.

Передача выполняется на одной машине (без сети, поэтому скорость не критична), но, тем не менее, чем быстрее / эффективнее, тем лучше.

Спасибо

Примечание. Я использую OpenCV в C ++, и основная цель заключается в обработке потока веб-камеры.Я не / не могу использовать JavaCV или что-то в этом роде!

Ответы [ 3 ]

3 голосов
/ 20 сентября 2010

Как насчет отправки байтов RGB.Вы можете получить RGB-байты из BufferedImage, а затем отправить его на уровень C ++ в виде байтового массива.А затем в слое C ++ создайте обратно изображение, используя этот байтовый массив.

2 голосов
/ 20 сентября 2010

Использование эффективного межязыкового формата обмена данными, такого как Google protobuf , может быть решением. Protobuf позволяет обмениваться объектами изображения следующим образом:

// Java image class

class Image {
    // ...
    byte[] getImageData() {
        return imageData_;
    }

    int getVersion() {
        return version_;
    }
    // ...
}

Объекты изображения могут быть сериализованы с использованием следующего сообщения protobuf:

message ImageMsg {
    required int32 version = 1;
    required bytes imageData = 2;
}

Компилятор protobuf сгенерирует классы Java и C ++ из этого определения. Из Java вы сериализуете Image как объект ImageMsg:

Image img;
// ...
ImageMsg.Builder msg = ImageMsg.newBuilder();
msg.setVersion(img.getVersion());
msg.setImageData(img.getImageData());
// The output stream could point to a file, socket, pipe or something else.
msg.writeTo(someOutputStream);

На стороне C ++ прочитайте объект из потока:

std::istream* is;
// initialize istream

ImageMsg msg;    
msg.ParseFromIstream(istream);
Image img(msg.getVersion(), msg.getImageData());

Также возможно сделать обратное, то есть отправить объект изображения из C ++ в Java.

1 голос
/ 20 сентября 2010

Вам следует либо использовать общий переносимый формат изображения (например, .png, .gif, .jpg, .bmp), учитывая, что некоторые из них являются потерями, либо отправлять необработанные пиксельные данные.Если вы отправляете необработанные данные, вам также необходимо убедиться, что оба конца знают высоту и ширину изображения и формат пикселя (то есть порядок каналов R, G, B и, возможно, A, а также количество битов).для каждого).Возможно, вам нужно сообщить об этом как часть сообщения, но, возможно, для вашего приложения некоторые из этих вещей всегда одинаковы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...