Я пытаюсь преобразовать необработанные данные пикселей в 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
Пожалуйста, поделитесь своей идеей, спасибо.
Когда вы сериализуете, вы пишете размер компонента как sizeof strlen(rc_data)
т.е. sizeof (size_t)
что, вероятно, намного меньше, чем содержание data
(это часто 4 или 8 байтов). Когда вы восстанавливаете данные изображения, вы читаете только этот размер, поэтому QImage
теперь относится к пространству памяти, которое не так велико, как должно быть для представления width
Иксheight
пиксели.
Вам нужно написать фактическую длину data
для того, чтобы прочитать его обратно успешно. strlen(rcdata)
почти наверняка неправильная мера, поскольку она измеряет строки с нулевым символом в конце, а ваши данные о пикселях — нет. Без полного примера невозможно сказать, как вы должны определить длину rc_data
,
Я решил эту проблему
writeBytes(rc_data,r_step*r_height)
readBytes(data,r_step*r_height)
Я проверил strlen (rc_data), но этот размер не правильный.
Фактический размер изображения был шаг * высота.
спасибо ребята ~~~ !!!
Используйте метод 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