Russian Qt Forum
Ноябрь 23, 2024, 22:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: не могу открыть QImage из принятого буффера. [РЕШЕНО]  (Прочитано 4467 раз)
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
могу приложить полный код.

« Последнее редактирование: Декабрь 01, 2011, 14:11 от Sadovnik » Записан
thechicho
Гость
« Ответ #1 : Ноябрь 30, 2011, 19:16 »

Код
C++ (Qt)
QPixmap imgPixmap;
imgPixmap.loadFromData(buffer->buffer());
chat->setPixmap(imgPixmap);

так попробуй
Записан
Sadovnik
Гость
« Ответ #2 : Ноябрь 30, 2011, 19:23 »

Код
C++ (Qt)
QPixmap imgPixmap;
imgPixmap.loadFromData(buffer->buffer());
chat->setPixmap(imgPixmap);

так попробуй
не-а Грустный не работает
Записан
thechicho
Гость
« Ответ #3 : Ноябрь 30, 2011, 21:28 »

а если так Улыбающийся

QPixmap imgPixmap;
imgPixmap.loadFromData(socket->readAll());
chat->setPixmap(imgPixmap);
Записан
Sadovnik
Гость
« Ответ #4 : Ноябрь 30, 2011, 23:26 »

а если так Улыбающийся

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

дело кажется в том, что сервер отправляет клиенту буффер порциями. Тоесть если у меня дописанный файл - конечно всё откроется без проблем. Но насколько я понял мне нужно завести ещё один буфер и дописывать в него эти порции, пока не получится полноценная картинка. Это должно быть легко, но пока я не понимаю как Улыбающийся
Записан
andrew.k
Гость
« Ответ #5 : Ноябрь 30, 2011, 23:46 »

например, запиши перед картинкой в сокет размер последующих данных.
При приеме сначала вычитываешь этот размер. Затем уже знаешь сколько данных ждать.
И собирай их на здоровье, затем загружай, как все приедут.
Записан
Sadovnik
Гость
« Ответ #6 : Декабрь 01, 2011, 00:42 »

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

например, запиши перед картинкой в сокет размер последующих данных.
При приеме сначала вычитываешь этот размер. Затем уже знаешь сколько данных ждать.
И собирай их на здоровье, затем загружай, как все приедут.
хорошая идея!
ну у меня первое, что в голову пришло, это сделать банальную проверку, пока loadfromdata не выдаст true, писать в буффер приходящие пакеты. как только нормально загрузилось, очищать этот накопительный буффер и ждать по новой.
Это плохая идея.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.084 секунд. Запросов: 21.