Russian Qt Forum

Qt => Работа с сетью => Тема начата: Sadovnik от Ноябрь 30, 2011, 17:36



Название: не могу открыть QImage из принятого буффера. [РЕШЕНО]
Отправлено: Sadovnik от Ноябрь 30, 2011, 17:36
Здравствуйте!
У меня такая задача:
есть клиент, есть сервер. на клиенте есть картинка, которая шлётся на сервер и рассылается всем подключенным клиентам.

Картинка в клиенте сворачивается в буффер так:
Код:
void SimpleChatClient::sendMessage()
{
    QImage image;
    image.load("C:\\test1.png", "PNG");
    QByteArray ba;
    QBuffer bufer(&ba);
    bufer.open(QIODevice::WriteOnly);
    image.save(&bufer, "PNG");
    imag.loadFromData(bufer.buffer());
    socket->write(ba);
    bufer.buffer().clear();
    bufer.close();
}

на сервере приниамется:

Код:
void SimpleChatServer::receiveMessage()
 {
     QTcpSocket* socket = static_cast<QTcpSocket*>(sender());
     QBuffer* buffer = buffers.value(socket);
     qint64 bytes = buffer->write(socket->readAll());
     buffer->seek(buffer->pos() - bytes);
     foreach (QTcpSocket* connection, connections)
     {
         connection->write(buffer->buffer());
     }
     buffer->seek(0);
     buffer->buffer().clear();
 }

и потом возвращемся в клиент:

Код:
void SimpleChatClient::receiveMessage()
{
        qint64 bytes = buffer->write(socket->readAll());
        buffer->seek(buffer->pos() - bytes);
        img.loadFromData(buffer->buffer());
                if(img.loadFromData(buffer->buffer()),"PNG")      // Check if the image was indeed received
                         qDebug("The image is null. Something failed.");
        chat->setPixmap(QPixmap::fromImage(img,0));
        buffer->seek(0);
        buffer->buffer().clear();
}

buffer описывается в хэдере клиента:
Код:
QBuffer*		buffer;

И говорит, что картинка пустая. Сохранял во всех трёх шагах буффер в файл: файлы идентичны и отлично читаются и открываются, как изображения.
если при отправки картинки открыть её после сворачивания в байты (из буффера) то всё нормально открывается и отображается в QLabel. Ведь буффер получается везде одинаковый. почему картинка в не открывается после приёма?

PS
могу приложить полный код.



Название: Re: не могу открыть QImage из принятого буффера.
Отправлено: thechicho от Ноябрь 30, 2011, 19:16
Код
C++ (Qt)
QPixmap imgPixmap;
imgPixmap.loadFromData(buffer->buffer());
chat->setPixmap(imgPixmap);

так попробуй


Название: Re: не могу открыть QImage из принятого буффера.
Отправлено: Sadovnik от Ноябрь 30, 2011, 19:23
Код
C++ (Qt)
QPixmap imgPixmap;
imgPixmap.loadFromData(buffer->buffer());
chat->setPixmap(imgPixmap);

так попробуй
не-а :( не работает


Название: Re: не могу открыть QImage из принятого буффера.
Отправлено: thechicho от Ноябрь 30, 2011, 21:28
а если так :)

QPixmap imgPixmap;
imgPixmap.loadFromData(socket->readAll());
chat->setPixmap(imgPixmap);


Название: Re: не могу открыть QImage из принятого буффера.
Отправлено: Sadovnik от Ноябрь 30, 2011, 23:26
а если так :)

QPixmap imgPixmap;
imgPixmap.loadFromData(socket->readAll());
chat->setPixmap(imgPixmap);

дело кажется в том, что сервер отправляет клиенту буффер порциями. Тоесть если у меня дописанный файл - конечно всё откроется без проблем. Но насколько я понял мне нужно завести ещё один буфер и дописывать в него эти порции, пока не получится полноценная картинка. Это должно быть легко, но пока я не понимаю как :)


Название: Re: не могу открыть QImage из принятого буффера.
Отправлено: andrew.k от Ноябрь 30, 2011, 23:46
например, запиши перед картинкой в сокет размер последующих данных.
При приеме сначала вычитываешь этот размер. Затем уже знаешь сколько данных ждать.
И собирай их на здоровье, затем загружай, как все приедут.


Название: Re: не могу открыть QImage из принятого буффера.
Отправлено: Sadovnik от Декабрь 01, 2011, 00:42
например, запиши перед картинкой в сокет размер последующих данных.
При приеме сначала вычитываешь этот размер. Затем уже знаешь сколько данных ждать.
И собирай их на здоровье, затем загружай, как все приедут.
хорошая идея!
ну у меня первое, что в голову пришло, это сделать банальную проверку, пока loadfromdata не выдаст true, писать в буффер приходящие пакеты. как только нормально загрузилось, очищать этот накопительный буффер и ждать по новой.


Название: Re: не могу открыть QImage из принятого буффера.
Отправлено: andrew.k от Декабрь 01, 2011, 01:32
например, запиши перед картинкой в сокет размер последующих данных.
При приеме сначала вычитываешь этот размер. Затем уже знаешь сколько данных ждать.
И собирай их на здоровье, затем загружай, как все приедут.
хорошая идея!
ну у меня первое, что в голову пришло, это сделать банальную проверку, пока loadfromdata не выдаст true, писать в буффер приходящие пакеты. как только нормально загрузилось, очищать этот накопительный буффер и ждать по новой.
Это плохая идея.