我有一个3D-Array(缓冲区的第一个索引)表示为图像并为其分配内存。然后我用0初始化它。但是,当我尝试将数组保存在QImage中,然后从图像中生成Pixmap时,我的程序在第一个bufferIndex处崩溃,并且在其他bufferIndex处不是黑色的(但有一些条纹)。我有什么问题?谢谢你!
#define BUFFERSIZE 8
#define SCENEHEIGHT 1024
#define SCENEWIDTH 1024
quint8 ***ringBuffer;
//allocating memory for videoBuffer
ringBuffer=(quint8 ***) malloc(BUFFERSIZE * sizeof(quint8 **));
for(int i=0;i<BUFFERSIZE;i++)
{
ringBuffer[i]=(quint8 **)malloc(SCENEHEIGHT * sizeof(quint8 *));
for(int y=0;y<SCENEHEIGHT;y++)
ringBuffer[i][y]=(quint8 *)malloc(SCENEWIDTH * sizeof(quint8));
}
//initializing videoBuffer
bufferIndex = 0;
for(int i=0;i<BUFFERSIZE;i++)
for(int y=0;y<SCENEWIDTH;y++)
for(int x=0;x<SCENEHEIGHT;x++)
ringBuffer[i][y][x]=0;
videoImage = new QImage(*(videoUDPSocketThread->videoSocket->ringBuffer[bufferIndex]),
/*crash at bufferIndex=0, no full black Image at bufferIndex= 1 to 7*/
SCENEWIDTH, SCENEHEIGHT, QImage::Format_Indexed8);
videoImage->setColorCount(256);
for(int i = 0; i < 256; i++)
videoImage->setColor(i, qRgb(i, 0, 0));
QPixmap::fromImage(*videoImage); //<-- crash at this point
//videoPixmap = ppiScene->addPixmap(QPixmap::fromImage(*videoImage));
编辑,新建Codevideoudpsocket.h
typedef QVector<QImage> RingBuffer;
class VideoUDPSocket : public QObject
{
Q_OBJECT
public:
quint8 bufferIndex;
RingBuffer ringBuffer;
private:
RingBuffer newBuffer();
QImage newImage();
signals:
void videoRead(int bufferIndex);
};
#endif // VIDEOUDPSOCKET_H
videoudpsocket.cpp
VideoUDPSocket::VideoUDPSocket(QObject *parent)
: QObject(parent)
{
ringBuffer = newBuffer();
bufferIndex = 0;
}
QImage VideoUDPSocket::newImage() {
QImage image = QImage(SCENEWIDTH, SCENEHEIGHT, QImage::Format_Indexed8);
image.setColorCount(256);
for (int i = 0; i < 256; ++i)
image.setColor(i, qRgb(i, 0, 0));
return image;
}
RingBuffer VideoUDPSocket::newBuffer() {
RingBuffer buffer;
buffer.reserve(BUFFERSIZE);
for (int i = 0; i < BUFFERSIZE; ++i)
buffer.push_back(newImage());
return buffer;
}
获取和设置vector - data:
ringBuffer.data()[bufferIndex].setPixel(x, y, max(signal%256, ringBuffer.data()[bufferIndex].pixelIndex(x,y)));
EDIT2,添加更多信息
此代码的目的是通过UDP-Socket(我认为每秒22MB)获得雷达视频数据,将数据从极坐标转换为笛卡尔坐标,包括偏移量和比例因子,以创建1024x1024像素的雷达视频。我认为我需要计算偏移量和缩放因子,以将数据直接保存到1024 × 1024图像,否则我将需要每个雷达视频图像约256 MB的数组。现在我知道我的算法太慢了我需要改进它
图像是一个连续的字节数组。你不能单独分配每一行——它必须全部放在一个块中。
你也不必要地在c++世界中编写C代码。使用容器——这就是它们的作用。最后,QImage
已经是一个容器了——没有必要为它的缓冲区手动分配内存。
typedef QVector<QImage> RingBuffer;
QImage newImage() {
const QSize kSceneSize { 1024, 1024 };
const auto kSceneFormat { QImage::Format_Indexed8 };
const auto kColorCount { 256 };
QImage image { kSceneSize, kSceneFormat };
image.setColorCount(kColorCount);
for (int i = 0; i < kColorCount; ++i)
image.setColor(i, qRgb(i, 0, 0));
return image;
}
RingBuffer newBuffer() {
const auto kBufferSize { 8 };
RingBuffer buffer;
buffer.reserve(kBufferSize);
for (int i = 0; i < kBufferSize; ++i)
buffer.push_back(newImage());
return buffer;
}
class MyClass : ... {
RingBuffer m_ring { newBuffer() };
...
};