QImage的数组在第一个索引处崩溃,isint在另一个索引处初始化为0



我有一个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));
编辑,新建Code

videoudpsocket.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() };
  ...
};  

相关内容

  • 没有找到相关文章

最新更新