Преобразование необработанных данных пикселей в QPixmap

Я пытаюсь преобразовать необработанные данные пикселей в QPixmap, но при преобразовании qimage в qpixmap возникает ошибка.

Сначала я отправляю необработанные данные с сервера A с помощью qlocalsocket, и клиент B получает их.

Это сервер А.

    if (clientSocket)
{
if (clientSocket->isOpen())
{
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);

out.setVersion(QDataStream::Qt_5_7);
const char* rc_data = reinterpret_cast<const char*>(r_data);
out <<sizeof(strlen(rc_data))<< r_width << r_height << r_step;
out.writeBytes(rc_data, strlen(rc_data));

clientSocket->write(block);
clientSocket->flush();
}
}

Это Клиент Б.

    QByteArray block = connection->readAll();
QDataStream in(&block, QIODevice::ReadOnly);
in.setVersion(QDataStream::Qt_5_7);
char* data;
size_t size;
int width;
int height;
int step;
while (!in.atEnd())
{
in >> size >> width >> height >> step;
in.readBytes(data,size);
}
mutex.lock();
receivePixmap = QPixmap::fromImage(QImage((unsigned char*)data, width, height, step, QImage::Format::Format_RGB888));
mutex.unlock();
ui.label->setPixmap(receivePixmap.scaled(ui.label->size(), Qt::KeepAspectRatio));
}

Нет ошибки при преобразовании данных (без знака char *) в QImage, но есть ошибка при QPixmap :: fromImage.

Когда я отлаживаю код, отправленные и полученные данные совпадают.

Это моя ошибка.
Ошибка: 0xC0000005: Место чтения нарушения доступа 0xCDCDCDD1.

И происходит здесь.

    #ifdef Q_COMPILER_RVALUE_REFS

static QPixmap fromImage(QImage &&image, Qt::ImageConversionFlags flags = Qt::AutoColor)
{
return fromImageInPlace(image, flags);
}
#endif

Пожалуйста, поделитесь своей идеей, спасибо.

0

Решение

Когда вы сериализуете, вы пишете размер компонента как sizeof strlen(rc_data)т.е. sizeof (size_t)что, вероятно, намного меньше, чем содержание data (это часто 4 или 8 байтов). Когда вы восстанавливаете данные изображения, вы читаете только этот размер, поэтому QImage теперь относится к пространству памяти, которое не так велико, как должно быть для представления widthИксheight пиксели.

Вам нужно написать фактическую длину data для того, чтобы прочитать его обратно успешно. strlen(rcdata) почти наверняка неправильная мера, поскольку она измеряет строки с нулевым символом в конце, а ваши данные о пикселях — нет. Без полного примера невозможно сказать, как вы должны определить длину rc_data,

1

Другие решения

Я решил эту проблему

    writeBytes(rc_data,r_step*r_height)
readBytes(data,r_step*r_height)

Я проверил strlen (rc_data), но этот размер не правильный.

Фактический размер изображения был шаг * высота.

спасибо ребята ~~~ !!!

0

Используйте метод loadFromData QPixmap:

bool QPixmap::loadFromData(const uchar * data, uint len, const char * format = 0, Qt::ImageConversionFlags flags = Qt::AutoColor)

Или же

bool QPixmap::loadFromData(const QByteArray & data, const char * format = 0, Qt::ImageConversionFlags flags = Qt::AutoColor)

Больше информации: http://doc.qt.io/qt-4.8/qpixmap.html#loadFromData

-1
По вопросам рекламы [email protected]