图像数组在第一个索引处崩溃,并且在其他索引处未用 0 初始化?
Array for QImage crashs at first index and isint initialized with 0 at other?
我有一个 3D 数组(缓冲区的第一个索引)用于表示为图像并为其分配内存。之后我用 0 初始化它。但是当我尝试将我的数组保存在 QImage 中然后从图像中制作一个 Pixmap 时,我的程序在第一个 bufferIndex 处崩溃并且在其他 bufferIndexes 处不是黑色(但有一些条纹) .我的问题是什么?谢谢!
#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));
编辑,新代码
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;
}
获取和设置 Vektor-Data:
ringBuffer.data()[bufferIndex].setPixel(x, y, max(signal%256, ringBuffer.data()[bufferIndex].pixelIndex(x,y)));
EDIT2,添加更多信息
此代码的目的是通过 UDP-Socket 获取雷达视频数据(我认为每秒 22MB),将数据从极坐标转换为笛卡尔坐标,包括偏移量和比例因子以创建雷达视频1024x1024 像素。我想我需要计算偏移量和比例因子以将数据直接保存到 1024x1024 图像,否则我需要每个雷达视频图像大约 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() };
...
};
我有一个 3D 数组(缓冲区的第一个索引)用于表示为图像并为其分配内存。之后我用 0 初始化它。但是当我尝试将我的数组保存在 QImage 中然后从图像中制作一个 Pixmap 时,我的程序在第一个 bufferIndex 处崩溃并且在其他 bufferIndexes 处不是黑色(但有一些条纹) .我的问题是什么?谢谢!
#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));
编辑,新代码
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;
}
获取和设置 Vektor-Data:
ringBuffer.data()[bufferIndex].setPixel(x, y, max(signal%256, ringBuffer.data()[bufferIndex].pixelIndex(x,y)));
EDIT2,添加更多信息
此代码的目的是通过 UDP-Socket 获取雷达视频数据(我认为每秒 22MB),将数据从极坐标转换为笛卡尔坐标,包括偏移量和比例因子以创建雷达视频1024x1024 像素。我想我需要计算偏移量和比例因子以将数据直接保存到 1024x1024 图像,否则我需要每个雷达视频图像大约 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() };
...
};